导图社区 MongoDB 备忘清单
"MongoDB 高效操作指南:从入门到集群管理一手掌握!这份备忘清单涵盖核心功能与实用技巧,包括集合创建与校验、CRUD操作、索引优化及数据库管理。
编辑于2025-04-08 18:09:31MongoDB 备忘清单
入门
连接 MongoDB Shell
使用 mongosh 命令可以通过默认端口连接到本地 MongoDB 实例。 非默认端口: 1、mongosh --port 28015 2、mongosh "mongodb://localhost:28015"
可以通过指定主机和端口连接到其他 MongoDB 实例, 例如 :1、mongosh --host <host> --port <port> -u <user> -p <pwd> ; 2、mongosh "mongodb://mongodb0.example.com:28015" --username alice --authenticationDatabase admin
连接到 MongoDB Atlas 集群指定数据库时,使用 mongosh "mongodb+srv://cluster-name.abcde.mongodb.net/<dbname>" --username <username> 。
显示数据库和集合
使用 show dbs 命令可以列出可用的数据库。
使用 db 命令可以打印当前数据库。
使用 show collections 命令可以列出当前数据库中的所有集合。
使用 use <database> 切换数据库
运行 JavaScript 文件
使用 load("myScript.js") 命令可以在 MongoDB Shell 中运行 JavaScript 文件。
load() 方法接受相对路径和绝对路径。如果 MongoDB Shell 的当前工作目录是 /data/db ,并且 connect-and-insert.js 位于/data/db/scripts 目录中,则 MongoDB Shell 中的以下调用是等效的: load( "scripts/connect-and-insert.js" ) load( "/data/db/scripts/connect-and-insert.js" )
CRUD 操作
插入文档
其他插入方法: db.collection.updateOne() 与 upsert: true 选项一起使用时。 db.collection.updateMany() 与 upsert: true 选项一起使用时。 db.collection.findAndModify() 与 upsert: true 选项一起使用时。 db.collection.findOneAndUpdate() 与 upsert: true 选项一起使用时。 db.collection.findOneAndReplace() 与 upsert: true 选项一起使用时。 db.collection.bulkWrite().
使用 db.coll.insertOne({ name: "Max" }) 可以插入单个文档。
使用 db.coll.insertMany([{ name: "Max"}, {name:"Alex"}]) 可以批量插入多个文档。
可以通过设置 ordered: false 来进行无序批量插入。
db.coll.insertMany([{ name: "Max"}, {name:"Alex"}], {ordered: false}) // 无序批量插入,即使某些文档插入失败,也会继续插入其他文档。 默认有序,一个失败则后续文档停止插入。
coll集合不存在时,插入操作将创建该集合。
读取文档
更新文档
删除文档
使用 db.inventory.deleteOne( { status: "D" } ) 删除符合条件的第一个文档。
使用 db.coll.deleteMany({name: "Max"}) 删除符合条件的文档。
使用 db.coll.deleteMany({}) 可以删除所有文档,但不会删除集合本身。
使用 db.coll.findOneAndDelete({"name": "Max"}) 可以查找并删除符合条件的第一个文档,并返回该文档。
数据库和集合管理
删除集合和数据库
使用 db.coll.drop() 可以删除集合及其索引定义。
使用 db.dropDatabase() 可以删除当前数据库。
创建集合
使用 db.createCollection("contacts", {...}) 可以创建一个新集合,并可以设置验证规则。
可以使用 $jsonSchema 来定义集合的结构和字段要求。
db.createCollection("contacts", { validator: { $jsonSchema: { bsonType: "object", required: ["name", "email"] } } });
其他集合功能
使用 db.coll.stats() 可以获取集合的统计信息,包括文档数量、存储大小等。
使用 db.coll.validate({full: true}) 可以验证集合的完整性。
索引管理
列出索引
使用 db.coll.getIndexes() 可以列出集合的所有索引(包括当前正在构建的索引)。
创建索引
db.collection.createIndex(keys, options)
使用 db.coll.createIndex({"name": 1}) 创建单字段升序索引。
如果未指定索引名称,MongoDB 会根据字段名和排序方向自动生成索引名称。例如,{ name: 1 } 的索引名称为 "name_1"。
使用 db.coll.createIndex({"name": 1, "date": 1}) 创建复合索引。
可以设置索引选项,例如唯一索引和部分索引。
// 在 age 字段上创建唯一索引 db.users.createIndex({ age: 1 }, { unique: true });
使用 db.users.createIndex( { email: 1 }, { partialFilterExpression: { status: "active" } } ); 创建部分索引(仅对满足条件的文档创建索引)
db.addresses.createIndex( { borough: 1 }, { hidden: true } );在 borough 字段上创建隐藏的升序索引
删除和管理索引
使用 db.coll.dropIndex("name_1") 从集合中删除指定的索引。
使用 db.collection.dropIndexes() 从集合或索引数组中删除所有可移动索引(如果指定,未指定就删除 _id 索引之外的所有索引)。
使用 db.coll.hideIndex("name_1_phone_1") 和 db.coll.unhideIndex("name_1") 可以隐藏或取消隐藏索引。("name_1_phone_1"可以修改成 { name: 1, phone: 1 } )
方便的命令
用户管理
使用 db.createUser({...}) 创建新用户并分配角色。
使用 db.auth("user", passwordPrompt()) 进行用户认证。
数据库操作
使用 db.getCollectionNames() 获取当前数据库的集合名称。
使用 db.stats() 获取数据库的统计信息。
监控和管理
使用 db.serverStatus() 获取服务器状态信息。
使用 db.getProfilingLevel() 查看当前的性能分析级别。
各种各样的操作
改变流
使用 watchCursor = db.coll.watch([...]) 监视集合的变化。
使用循环处理监视到的变化,例如打印新插入的文档。
分片集群管理
使用 sh.status() 查看分片集群的状态。
使用 sh.addShard("rs1/mongodbd1.example.net:27017") 添加新的分片。
副本集管理
使用 rs.status() 查看副本集的状态。
使用 rs.initiate({...}) 初始化副本集并添加成员。
读取文档
高级查询功能
逻辑运算符
功能:组合多个查询条件。
常用运算符
$and:使用逻辑 AND 连接查询子句将返回与两个子句的条件匹配的所有文档。
$not:反转查询谓词的效果,并返回与查询谓词不匹配的文档。
$nor:使用逻辑 NOR 的联接查询子句会返回无法匹配这两个子句的所有文档。
$or:使用逻辑 OR 连接多个查询子句会返回符合任一子句条件的所有文档。
示例:
使用 $and: db.users.find({ $and: [{ age: { $gt: 20 } }, { age: { $lt: 30 } }] });
使用 $or: db.users.find({ $or: [{ name: "Alice" }, { name: "Bob" }] });
比较运算符
功能:用于比较字段值。
常用运算符:
$eq:等于
$ne:不等于
$gt:大于
$gte:大于等于
$lt:小于
$lte:小于等于
$in:匹配数组中包含指定值的文档。
$nin:匹配数组中不包含指定值的文档。
示例:
查找年龄等于 25 的用户: db.users.find({ age: { $eq: 25 } });
查找年龄大于 25 的用户: db.users.find({ age: { $gt: 25 } });
查找 hobbies 数组中包含 "reading" 的用户: db.users.find({ hobbies: { $in: ["reading"] } });
数组查询
功能:查询包含数组字段的文档。
常用操作符:
$all:匹配数组中包含所有指定值的文档。
$size:匹配数组长度为指定值的文档。
示例:
查找 hobbies 数组中包含 "reading" 和 "writing" 的用户: db.users.find({ hobbies: { $all: ["reading", "writing"] } });
查找 hobbies 数组长度为 3 的用户: db.users.find({ hobbies: { $size: 3 } });
正则表达式
功能:使用正则表达式匹配字段值。
示例:
查找名字以 "A" 开头的用户: db.users.find({ name: /^A/ });
查找名字包含 "li" 的用户: db.users.find({ name: /li/ });
不区分大小写:db.coll.find({name: /^A$/i})
分页查询
功能:通过 skip 和 limit 实现分页。
示例:
跳过前 10 条记录,返回接下来的 5 条记录: db.users.find().skip(10).limit(5);
排序
功能:对查询结果进行排序。
示例:
按年龄升序排序: db.users.find().sort({ age: 1 });
按年龄降序排序: db.users.find().sort({ age: -1 });
其他常用命令
db.collection.countDocuments()
功能:统计符合条件的文档数量。
示例:
统计年龄大于 25 的用户数量: db.users.countDocuments({ age: { $gt: 25 } });
db.collection.distinct()
功能:获取指定字段的唯一值。
示例:
获取所有用户的唯一城市: db.users.distinct("city");
db.collection.explain()
功能:分析查询性能。
示例:
分析查询性能: db.users.find({ age: { $gt: 25 } }).explain("executionStats");
db.collection.watch()
功能:监听集合的实时变更(适用于副本集或分片集群)。
示例:
监听 users 集合的变更:
聚合查询
db.collection.aggregate()
功能:执行复杂的聚合操作,如分组、过滤、排序等。
语法:db.collection.aggregate(pipeline, options)
示例:
db.orders.aggregate([ { $match: { amount: { $gt: 50 } } }, // 筛选金额大于 50 的订单 { $group: { _id: "$cust_id", // 按客户 ID 分组 totalAmount: { $sum: "$amount" } // 计算总金额 } }, { $sort: { totalAmount: -1 } } // 按总金额降序排序 ]);
基本查询命令
db.collection.find()
功能:查询集合中的所有文档。
语法: db.collection.find(query, projection)
参数:
query(可选):筛选条件,默认为空对象 {} ,表示匹配所有文档。
projection(可选):指定返回的字段。
示例:
查询所有文档: db.users.find();
查询年龄大于 25 的用户: db.users.find({ age: { $gt: 25 } });
查询所有文档,仅返回 name 字段: db.users.find({}, { name: true, _id: false });
其中 true 和 fasle 可以用 1 和 0 代替:db.users.find({}, { name: 1, _id: 0 })
db.collection.findOne()
功能:查询集合中的一个文档。
语法: db.collection.findOne(query, projection)
参数:
query(可选):筛选条件,默认为空对象 {} ,表示匹配第一个文档。
projection(可选):指定返回的字段。
示例:
查找第一个文档: db.users.findOne();
查找名字为 "Alice" 的用户: db.users.findOne({ name: "Alice" });
查找名字为 "Alice" 的用户,仅返回 name 字段: db.users.findOne({ name: "Alice" }, { name: true, _id: false });
更新文档
db.collection.updateOne()
功能:更新与查询条件匹配的第一个文档。
语法: db.collection.updateOne(filter, update, options)
参数:
filter:筛选条件,用于匹配要更新的文档。
update:更新操作,可以是更新操作符或替换整个文档。
options(可选):指定更新选项,如 upsert。
示例:
将名字为 "Alice" 的用户的年龄更新为 25。
db.collection.updateMany()
功能:更新与查询条件匹配的所有文档。
语法: db.collection.updateMany(filter, update, options)
参数:
filter:筛选条件,用于匹配要更新的文档。
update:更新操作,可以是更新操作符或替换整个文档。
options(可选):指定更新选项,如 upsert。
示例:
将所有年龄大于 30 的用户标记为 "senior"。
db.collection.findAndModify()
功能:查找并更新文档,同时返回更新前或更新后的文档。
语法: db.collection.findAndModify(options)
参数:
query:筛选条件。
update:更新操作。
new(可选):是否返回更新后的文档,默认为 false。
upsert(可选):如果找不到匹配文档,是否插入新文档。
示例:
查找并更新名字为 "Alice" 的用户,返回更新后的文档。
db.collection.replaceOne()
功能:替换与查询条件匹配的第一个文档。
语法: db.collection.replaceOne(filter, replacement, options)
参数:
filter:筛选条件,用于匹配要替换的文档。
replacement:新的文档内容(不是更新操作符)。
options(可选):指定替换选项,如 upsert。
示例:
替换名字为 "Alice" 的用户文档。
查询操作符详解
查询选择器
$eq
功能:匹配等于指定值的字段。
示例: db.users.find({ age: { $eq: 25 } }); 等价于 db.users.find({ age: 25 });
适用场景:用于查找特定年龄的用户。
$gt
功能:匹配大于指定值的字段。
示例: db.products.find({ price: { $gt: 100 } });
适用场景:用于查找价格高于100的产品。
$gte
功能:匹配大于等于指定值的字段。
示例: db.products.find({ price: { $gte: 100 } });
适用场景:用于查找价格大于或等于100的产品。
$in
功能:匹配字段值在指定数组中的文档。
示例: db.users.find({ name: { $in: ["Alice", "Bob"] } });
适用场景:用于查找名字为Alice或Bob的用户。
$lt
功能:匹配小于指定值的字段。
示例: db.products.find({ price: { $lt: 50 } });
适用场景:用于查找价格低于50的产品。
$lte
功能:匹配小于等于指定值的字段。
示例: db.products.find({ price: { $lte: 50 } });
适用场景:用于查找价格低于或等于50的产品。
$ne
功能:匹配不等于指定值的字段。
示例: db.users.find({ age: { $ne: 25 } });
适用场景:用于查找年龄不为25的用户。
$nin
功能:匹配字段值不在指定数组中的文档。
示例: db.users.find({ name: { $nin: ["Alice", "Bob"] } });
适用场景:用于查找名字不为Alice或Bob的用户。
逻辑操作符
$and
功能:返回满足所有条件的文档。
示例: db.users.find({ $and: [{ age: { $gt: 20 } }, { age: { $lt: 30 } }] });
适用场景:用于查找年龄在20到30之间的用户。
$not
功能:反转查询谓词的效果。
示例: db.users.find({ age: { $not: { $gt: 25 } } });
适用场景:用于查找年龄不大于25的用户。
$nor
功能:返回不符合任何条件的文档。
示例: db.users.find({ $nor: [{ age: 25 }, { name: "Alice" }] });
适用场景:用于查找年龄不是25且名字不是Alice的用户。
$or
功能:返回满足任意一个条件的文档。
示例: db.users.find({ $or: [{ age: 25 }, { name: "Alice" }] });
适用场景:用于查找年龄为25或名字为Alice的用户。
数组操作符
$all
功能:匹配包含所有指定元素的数组。
示例: db.products.find({ tags: { $all: ["electronics", "gadgets"] } });
适用场景:用于查找标签包含“electronics”和“gadgets”的产品。
$elemMatch
功能:匹配数组中至少有一个元素满足所有条件的文档。
示例: db.students.find({ scores: { $elemMatch: { $gte: 80, $lt: 90 } } });
适用场景:用于查找至少有一个分数在80到90之间的学生。
$size
功能:匹配数组长度为指定值的文档。
示例: db.users.find({ hobbies: { $size: 3 } });
适用场景:用于查找爱好数量为3的用户。
元素操作符
$exists
功能:匹配包含或不包含指定字段的文档。
示例: db.users.find({ email: { $exists: true } }); 和 db.users.find({ email: { $exists: false } });
适用场景:用于查找包含或不包含email字段的用户。
$type
功能:匹配字段值为指定 BSON 类型的文档。
示例: db.users.find({ age: { $type: "number" } });
适用场景:用于查找年龄字段为数字类型的用户。
求值操作符
$expr
功能:允许在查询中使用聚合表达式。
示例: db.sales.find({ $expr: { $gt: ["$price", "$discountedPrice"] } });
适用场景:用于查找价格高于折后价格的销售记录。
$mod
功能:对字段值执行模运算。
示例: db.products.find({ price: { $mod: [4, 0] } });
适用场景:用于查找价格为4的倍数的产品。
$regex
功能:匹配字段值符合正则表达式的文档。
示例: db.users.find({ name: { $regex: "^A" } });
适用场景:用于查找名字以A开头的用户。
$text
功能:执行文本搜索(需要创建文本索引)。
示例: db.articles.createIndex({ content: "text" }); 和 db.articles.find({ $text: { $search: "MongoDB" } });
适用场景:用于查找包含“MongoDB”的文章。
地理空间操作符
$near
功能:返回接近某个点的地理空间对象。
示例: db.places.find({ location: { $near: { $geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, $maxDistance: 1000 } } });
适用场景:用于查找距离指定坐标1000米内的地点。
$geoWithin
功能:选择在边界内的地理空间对象。
示例: db.places.find({ location: { $geoWithin: { $geometry: { type: "Polygon", coordinates: [[[-73.9, 40.7], [-73.9, 40.8], [-73.8, 40.8], [-73.8, 40.7], [-73.9, 40.7]]] } } });
适用场景:用于查找位于指定多边形内的地点。
位运算符
$bitsAllClear
功能:匹配位位置均为0的数值。
示例: db.numbers.find({ value: { $bitsAllClear: [1, 3] } });
适用场景:用于查找在特定位上均为0的数字。
$bitsAnySet
功能:匹配位位置中有任意一位为1的数值。
示例: db.numbers.find({ value: { $bitsAnySet: [2, 4] } });
适用场景:用于查找在特定位上至少有一位为1的数字。
投影操作符
$slice
功能:限制从数组中投影的元素数量。
示例: db.users.find({}, { hobbies: { $slice: 2 } });
适用场景:用于返回用户的前两个爱好。
$meta
功能:投影文本搜索得分。
示例: db.articles.find({ $text: { $search: "MongoDB" } }, { score: { $meta: "textScore" } });
适用场景:用于返回包含“MongoDB”的文章及其文本搜索得分。
其他操作符
$rand
功能:生成随机数。
示例: db.collection.aggregate([{ $match: { $expr: { $lt: [{ $rand: {} }, 0.1] } } }]);
适用场景:用于随机选择文档。
更新操作符详解
2. 数组更新操作符
(1) $
功能是作为占位符,用于更新与查询条件匹配的第一个数组元素。
示例:将第一个大于等于 90 的分数更新为 100。
示例: db.students.updateOne({ scores: { $gte: 90 } }, { $set: { "scores.$": 100 } }); 。
(2) $[]
功能是作为占位符,用于更新数组中所有元素。
示例:将每个学生的分数增加 5。
示例: db.students.updateMany({}, { $inc: { "scores.$[]": 5 } }); 。
(3) $[<identifier>]
功能是作为占位符,用于更新与 arrayFilters 条件匹配的数组元素。
示例:将每个学生中大于等于 90 的分数增加 10。
示例: db.students.updateMany({}, { $inc: { "scores.$[elem]": 10 } }, { arrayFilters: [{ elem: { $gte: 90 } }] }); 。
(4) $addToSet
功能是向数组中添加尚不存在于该数组的元素。
示例:向 Alice 的爱好数组中添加 reading(如果尚未存在)。
示例: db.users.updateOne({ name: "Alice" }, { $addToSet: { hobbies: "reading" } }); 。
(5) $pop
功能是删除数组的第一项或最后一项。
示例:删除 Alice 的爱好数组中的最后一项。
示例: db.users.updateOne({ name: "Alice" }, { $pop: { hobbies: 1 } }); 。
(6) $pull
功能是删除与指定查询匹配的所有数组元素。
示例:从 Alice 的爱好数组中删除 reading。
示例: db.users.updateOne({ name: "Alice" }, { $pull: { hobbies: "reading" } }); 。
(7) $push
功能是向数组中添加一项。
示例:向 Alice 的爱好数组中添加 writing。
示例: db.users.updateOne({ name: "Alice" }, { $push: { hobbies: "writing" } }); 。
(8) $pullAll
功能是从数组中删除所有匹配值。
示例:从 Alice 的爱好数组中删除 reading 和 writing。
示例: db.users.updateOne({ name: "Alice" }, { $pullAll: { hobbies: ["reading", "writing"] } }); 。
3. 数组修饰符
(1) $each
功能是修改 $push 和 $addToSet ,以追加多个项目。
示例:向 Alice 的爱好数组中添加 painting 和 cooking。
示例: db.users.updateOne({ name: "Alice" }, { $push: { hobbies: { $each: ["painting", "cooking"] } } }); 。
(2) $position
功能是修改 $push ,以指定在数组中添加元素的位置。
示例:在 Alice 的爱好数组的开头添加 painting。
示例: db.users.updateOne({ name: "Alice" }, { $push: { hobbies: { $each: ["painting"], $position: 0 } } }); 。
(3) $slice
功能是修改 $push ,以限制更新后数组的大小。
示例:在 Alice 的爱好数组中最多保留 3 个元素。
示例: db.users.updateOne({ name: "Alice" }, { $push: { hobbies: { $each: ["painting"], $slice: 3 } } }); 。
(4) $sort
功能是修改 $push ,以对数组中的文档重新排序。
示例:按降序对 Alice 的分数数组进行排序。
示例: db.users.updateOne({ name: "Alice" }, { $push: { scores: { $each: [85, 95], $sort: -1 } } }); 。
4. 位运算符
(1) $bit
功能是对整数值执行按位 AND、OR 和 XOR 更新。
示例:对产品 Laptop 的 flags 字段执行按位 AND 和 OR 操作。
示例: db.products.updateOne({ name: "Laptop" }, { $bit: { flags: { and: 5, or: 3 } } }); 。
5. 其他更新选项
upsert
功能:如果找不到匹配文档,则插入新文档。
示例:
如果用户 "Bob" 不存在,则插入新用户并设置年龄为 30。 db.users.updateOne( { name: "Bob" }, { $set: { age: 30 } }, { upsert: true } );
1. 字段更新操作符
(1) $currentDate
功能是将字段的值设置为当前日期或时间戳。
示例:将用户 Alice 的 lastModified 字段设置为当前日期(ISODate 类型)。
db.users.updateOne({ name: "Alice" }, { $currentDate: { lastModified: true } });
(2) $inc
功能是将字段的值按指定量递增或递减。
示例:将产品 Laptop 的库存减少 1。
示例: db.products.updateOne({ name: "Laptop" }, { $inc: { stock: -1 } }); 。
(3) $min
功能是仅当指定值小于现有字段值时才更新字段。
示例:如果当前价格高于 800,则将 Laptop 的价格更新为 800。
示例: db.products.updateOne({ name: "Laptop" }, { $min: { price: 800 } }); 。
(4) $max
功能是仅当指定值大于现有字段值时才更新字段。
示例:如果当前价格低于 1200,则将 Laptop 的价格更新为 1200。
示例: db.products.updateOne({ name: "Laptop" }, { $max: { price: 1200 } }); 。
(5) $mul
功能是将字段的值乘以指定量。
示例:将 Laptop 的价格提高 10%。
示例: db.products.updateOne({ name: "Laptop" }, { $mul: { price: 1.1 } }); 。
(6) $rename
功能是重命名字段。
示例:将用户 Alice 的 firstName 字段重命名为 name。
示例: db.users.updateOne({ name: "Alice" }, { $rename: { firstName: "name" } }); 。
(7) $set
功能是设置字段的值。
示例:将用户 Alice 的年龄设置为 25。
示例: db.users.updateOne({ name: "Alice" }, { $set: { age: 25 } }); 。
(8) $setOnInsert
功能是仅在插入新文档时设置字段的值,对更新现有文档无影响。
示例:如果 Bob 不存在,则插入新文档并设置 createdAt 字段。
示例: db.users.updateOne({ name: "Bob" }, { $setOnInsert: { createdAt: new Date() } }, { upsert: true }); 。
(9) $unset
功能是从文档中删除字段。
示例:删除用户 Alice 的 age 字段。
示例: db.users.updateOne({ name: "Alice" }, { $unset: { age: "" } }); 。
更新操作符概述
更新操作符的定义与用途
更新操作符用于修改MongoDB集合中的文档,支持字段值的更新、数组的操作以及位运算等。
这些操作符可以灵活组合,以实现复杂的文档更新需求。
适用于MongoDB Atlas、Enterprise和Community版本。
兼容性与语法
兼容性:支持MongoDB Atlas、Enterprise和Community版本。
语法格式:{ <operator1>: { <field1>: <value1>, ... }, <operator2>: { <field2>: <value2>, ... }, ... }。
更新操作符的行为
从MongoDB 5.0开始,更新运算符按字典顺序处理字符串名称的字段,数字名称的字段按数字顺序处理。