MongoDB基础入门:从安装到CRUD与索引优化

发布时间:2026/7/9 9:49:49

MongoDB基础入门:从安装到CRUD与索引优化 MongoDB作为当下最流行的NoSQL数据库其灵活的文档模型和强大的查询能力让它成为现代应用开发的首选。无论你是数据库新手还是有经验的开发者本文将带你从零开始掌握MongoDB的核心技能建立扎实的基础。MongoDB简介与安装配置MongoDB是什么它是一个基于分布式文件存储的开源文档数据库将数据存储为JSON格式的文档支持动态查询、索引和水平扩展。核心优势灵活的数据模型无需预定义表结构文档结构可以根据需求随时调整强大的查询能力支持丰富的查询操作符和聚合管道高可扩展性支持水平分区能够处理海量数据内存映射自动管理内存使用提供高性能数据访问安装与配置Windows环境下安装# 使用winget安装MongoDB Community版wingetinstallMongoDB.Server wingetinstallMongoDB.ShellDocker方式部署推荐dockerrun-d--namemongodb\-p27017:27017\-eMONGO_INITDB_ROOT_USERNAMEadmin\-eMONGO_INITDB_ROOT_PASSWORDpassword\mongo:latest验证安装// 连接到MongoDBmongoshmongodb://admin:passwordlocalhost:27017// 查看版本信息db.version()// 查看服务器状态db.serverStatus()核心概念与数据模型基本概念对比SQL概念MongoDB对应说明数据库database数据处理单元表collection文档的容器行documentJSON格式的数据记录列field文档中的字段主键_id自动生成的唯一标识// 文档示例用户数据{_id:ObjectId(507f1f77bcf86cd799439011),name:张三,age:28,email:zhangsanexample.com,address:{city:北京,district:海淀区},hobbies:[阅读,编程,运动],createdAt:ISODate(2025-12-19T10:30:00.000Z)}数据类型MongoDB支持丰富的数据类型String字符串类型Integer整数32位和64位Boolean布尔值Double浮点数Arrays数组Object嵌套对象Date日期时间ObjectId12字节唯一标识符CRUD基础操作实战创建数据库与集合// 切换到目标数据库不存在则自动创建use blogDB// 创建集合可选插入数据时自动创建db.createCollection(users)db.createCollection(articles)// 查看当前数据库的集合db.getCollectionNames()数据插入操作单文档插入// 插入单个用户文档db.users.insertOne({name:李四,age:25,email:lisiexample.com,createdAt:newDate()})// 返回结果包含插入文档的_id// {acknowledged:true,insertedId:ObjectId(...)}批量插入// 插入多个文档db.users.insertMany([{name:王五,age:30,email:wangwuexample.com,city:上海},{name:赵六,age:22,email:zhaoliuexample.com,city:广州}])// 批量插入结果// {acknowledged:true,insertedIds:[ObjectId(...),ObjectId(...)]}数据查询操作基础查询// 查询所有文档db.users.find()// 带条件查询 - 查找年龄大于等于25的用户db.users.find({age:{$gte:25}})// 精确查找db.users.find({name:张三})// 查询单个文档db.users.findOne({email:zhangsanexample.com})高级查询操作符// 比较操作符db.users.find({age:{$lt:30,$gt:20}})// 20 age 30db.users.find({age:{$in:[20,25,30]}})// age等于数组中任意值// 逻辑操作符db.users.find({$and:[{age:{$gte:25}},{city:上海}]})db.users.find({$or:[{age:{$lt:25}},{city:北京}]})// 正则表达式查询db.users.find({name:/张/})// 名字包含张db.users.find({email:/.\.com$/})// 邮箱以.com结尾查询结果处理// 限制返回数量db.users.find().limit(10)// 跳过指定数量db.users.find().skip(20).limit(10)// 排序db.users.find().sort({age:1})// 1升序-1降序db.users.find().sort({age:-1,name:1})// 字段投影 - 指定返回字段db.users.find({},{name:1,age:1,_id:0// 不返回_id字段})数据更新操作更新单个文档// 更新指定用户的年龄db.users.updateOne({name:张三},// 查询条件{$set:{age:29},// 设置新值$currentDate:{updatedAt:true}// 更新时间戳})批量更新文档// 更新所有北京的用户的年龄1db.users.updateMany({city:北京},{$inc:{age:1}}// 自增操作符)更新操作符详解// $set - 设置字段值db.users.updateOne({name:张三},{$set:{address.city:上海,status:active}})// $unset - 删除字段db.users.updateOne({name:李四},{$unset:{temporaryField:}})// $push - 向数组添加元素db.users.updateOne({name:张三},{$push:{hobbies:旅游}})// $pull - 从数组移除元素db.users.updateOne({name:张三},{$pull:{hobbies:编程}})// $addToSet - 避免重复添加db.users.updateOne({name:张三},{$addToSet:{hobbies:烘焙}})数据删除操作删除文档// 删除单个文档db.users.deleteOne({name:李四})// 批量删除文档db.users.deleteMany({age:{$lt:20}})// 删除所有文档保留集合结构db.users.deleteMany({})删除集合和数据库// 删除集合db.users.drop()// 删除数据库db.dropDatabase()索引优化与查询性能索引基础为什么需要索引想象一下在一本没有目录的书中寻找特定内容索引就如同书的目录能大幅加速数据查找。// 查看集合的索引db.users.getIndexes()// 创建单字段索引db.users.createIndex({name:1})// 1升序-1降序db.users.createIndex({email:1},{unique:true})// 唯一索引// 创建复合索引db.users.createIndex({city:1,age:-1})// 创建TTL索引自动过期db.users.createIndex({createdAt:1},{expireAfterSeconds:604800,// 7天后自动删除name:ttl_7days})复合索引设计原则// 等值查询 排序场景// 查询db.users.find({ city: 上海 }).sort({ age: -1 })// 索引{ city: 1, age: -1 }db.users.createIndex({city:1,age:-1})// 多条件等值查询// 查询db.users.find({ city: 上海, status: active })// 索引{ city: 1, status: 1 }db.users.createIndex({city:1,status:1})// 包含数组字段的索引db.users.createIndex({hobbies:1})// 多键索引查询执行计划分析// 查看查询执行计划db.users.find({age:{$gte:25}}).explain(executionStats)// 强制使用特定索引db.users.find({name:张三}).hint({name:1})// 创建文本索引支持全文搜索db.articles.createIndex({title:text,content:text},{weights:{title:10,content:5},// 标题权重更高name:text_search_idx})// 文本搜索查询db.articles.find({$text:{$search:MongoDB 教程}},{score:{$meta:textScore}}).sort({score:{$meta:textScore}})索引管理最佳实践// 索引使用情况统计db.users.aggregate([{$indexStats:{}}])// 删除不需要的索引db.users.dropIndex(index_name)// 查看所有索引大小db.users.aggregate([{$collStats:{indexSizes:{}}}])实践项目博客系统数据模型让我们通过一个简单的博客系统来综合运用所学知识数据结构设计// 1. 用户集合db.createCollection(users,{validator:{$jsonSchema:{bsonType:object,required:[username,email],properties:{username:{bsonType:string,minLength:3},email:{bsonType:string,pattern:^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\\.[a-zA-Z]{2,}$},password:{bsonType:string,minLength:6},profile:{bsonType:object},roles:{bsonType:array},createdAt:{bsonType:date},updatedAt:{bsonType:date}}}}})// 2. 文章集合db.createCollection(posts,{validator:{$jsonSchema:{bsonType:object,required:[title,content,authorId],properties:{title:{bsonType:string,minLength:1},content:{bsonType:string,minLength:10},authorId:{bsonType:objectId},tags:{bsonType:array,items:{bsonType:string}},status:{enum:[draft,published,archived]},viewCount:{bsonType:int,minimum:0},createdAt:{bsonType:date},publishedAt:{bsonType:date}}}}})实战操作示例// 创建用户db.users.insertOne({username:blog_admin,email:adminblog.com,password:hashed_password,profile:{displayName:博客管理员,bio:负责博客系统维护,avatar:/uploads/avatar1.jpg},roles:[admin,editor],createdAt:newDate(),updatedAt:newDate()})// 创建文章db.posts.insertOne({title:MongoDB基础教程,content:这是一份详细的MongoDB入门指南...,authorId:ObjectId(507f1f77bcf86cd799439011),tags:[MongoDB,NoSQL,数据库],status:published,viewCount:0,createdAt:newDate(),publishedAt:newDate()})// 查询用户发布的文章db.posts.find({authorId:ObjectId(507f1f77bcf86cd799439011),status:published}).sort({publishedAt:-1})性能优化实践// 创建优化索引db.posts.createIndex({authorId:1,status:1,publishedAt:-1})db.posts.createIndex({tags:1,publishedAt:-1})db.posts.createIndex({viewCount:-1})db.users.createIndex({email:1},{unique:true})// 使用投影优化查询性能db.posts.find({status:published,tags:MongoDB},{title:1,tags:1,viewCount:1,publishedAt:1,_id:0}).limit(10)这份MongoDB基础教程为你建立了扎实的技术地基。从安装配置到CRUD操作从索引优化到实战项目每一个环节都是实际开发中必需的技能。掌握这些基础知识后你已经具备了使用MongoDB进行应用开发的核心能力。接下来的进阶教程将深入探讨聚合框架、事务管理和性能调优等高级主题。

相关新闻