语句
前言
一、db.collection.analyzeShardKey()
1.1 认识
db.collection.analyzeShardKey()
计算用于求值分片键的指标。
1.2 语法
1.3 用法
二、db.collection.aggregate()
2.1 认识
db.collection.aggregate()
提供对聚合管道的访问权限。
2.2 语法
2.3 用法
三、db.collection.bulkWrite()
3.1 认识
db.collection.bulkWrite()
提供批量写入操作功能。
3.2 语法
db.<collection>.bulkWrite(
[ <operation 1>, <operation 2>, ... ],
{
writeConcern : <document>,
ordered : <boolean>
}
)
db.<collection>.bulkWrite( [
{ insertOne : { "document" : <document> } }
] )
3.3 用法
db.user.bulkWrite([{ insertOne: { document: { name: "亚索", age: 6300, like: ["龙卷风"] }}}]);
try{ db.user.bulkWrite([{ insertOne: { document: { name: "亚索", age: 6300, like: ["龙卷风"] }}}]); }.catch(error=> print(error));
db.user.bulkWrite([{ insertOne: { document: { name: "剑姬", age: 6300, like: ["无双剑姬"] }}}, { insertOne: { name: "剑圣", age: 450, like: ["无敌大招"] }}]);
try{ db.user.bulkWrite([{ insertOne: { document: { name: "剑姬", age: 6300, like: ["无双剑姬"] }}}, { insertOne: { name: "剑圣", age: 450, like: ["无敌大招"] }}]); }.catch(error=> print(error));
四、db.collection.configureQueryAnalyzer()
4.1 认识
db.collection.configureQueryAnalyzer()
为集合配置查询采样。
4.2 语法
4.3 用法
五、db.collection.count()
5.1 认识
db.collection.count()
封装 count,返回集合中或视图中文档的计数。
5.2 语法
5.3 用法
六、db.collection.countDocuments()
6.1 认识
db.collection.countDocuments()
使用 group 聚合阶段,返回集合或视图中文档的计数。
6.2 语法
6.3 用法
七、db.collection.createIndex()
7.1 认识
db.collection.createIndex()
在集合上构建索引。
7.2 语法
7.3 用法
八、db.collection.createIndexes()
8.1 认识
db.collection.createIndexes()
为集合构建一个或多个索引。
8.2 语法
8.3 用法
九、db.collection.dataSize()
9.1 认识
db.collection.dataSize()
返回集合的大小。封装 collStats 的输出中的 size 字段。
9.2 语法
9.3 用法
十、db.collection.deleteOne()
10.1 认识
db.collection.deleteOne()
删除集合中的单个文档。
10.2 语法
10.3 用法
十一、db.collection.deleteMany()
11.1 认识
db.collection.deleteMany()
删除集合中的多个文档。
11.2 语法
11.3 用法
十二、db.collection.distinct()
12.1 认识
db.collection.distinct()
返回具有指定字段的不同值的文档数组。
12.2 语法
12.3 用法
十三、db.collection.drop()
13.1 认识
db.collection.drop()
从数据库中删除指定的集合。
13.2 语法
13.3 用法
十四、db.collection.dropIndex()
14.1 认识
db.collection.dropIndex()
删除集合的指定索引。
14.2 语法
14.3 用法
十五、db.collection.dropIndexes()
15.1 认识
db.collection.dropIndexes()
删除集合上的所有索引。
15.2 语法
15.3 用法
十六、db.collection.ensureIndex()
16.1 认识
db.collection.ensureIndex()
已删除。使用 db.collection.createIndex()
。
16.2 语法
16.3 用法
十七、db.collection.estimatedDocumentCount()
17.1 认识
db.collection.estimatedDocumentCount()
封装 count,返回集合或视图中文档的大致计数。
17.2 语法
17.3 用法
十八、db.collection.explain()
18.1 认识
db.collection.explain()
返回各种方法的查询执行信息。
18.2 语法
18.3 用法
十九、db.collection.find()
19.1 认识
db.collection.find()
对集合或视图执行查询,并返回游标对象。
19.2 语法
db.<collection>.find( <query>, <projection>, <options> )
-
query
查询:-
匹配查询:
{ <field>: 指定值 }
-
比较操作符:
-
{ <field>: { $lt: <value> } }
-
{ <field>: { $gt: <value> } }
-
{ <field>: { $eq: <value> } }
-
{ <field>: { $ne: <value> } }
-
{ <field>: { $in: [<value1>, <value2>, ……] }}
-
{ <field>: { $nin: [<value1>, <value2>, ……] }}
-
{ <field>: { $lte: <value> } }
-
{ <field>: { $gte: <value> } }
-
-
逻辑操作符:
-
{ <field>: { $not: { <operator-expression> }}}
-
{ $or: [ {<expression>}, {<expression>}, ……]}
-
{ $nor: [ {<expression>}, {<expression>}, ……]}
-
{ $and: [ {<expression>}, {<expression>}, ……]}
或者{ <expression>, <expression>, …… }
-
-
字段操作符
-
{ <field>: { $exists: <boolean> }}
-
{ <field>: { $type: [<BSON type1>, <BSON type2>, ……]}}
-
-
数组操作符:
-
{ <field>: { $all: [ <value1>, <value2> …… ]}}
-
{ <field>: { $elemMatch: { <query1>, <query2>, ……}}}
-
-
运算操作符
{ <field>: { $regex: /pattern/, $options: <options> } }
-
-
projection
投射:-
{ <field>: <1 or true> }
: 指定包含字段。如果为投影值指定非零整数,则该操作会将该值视为true
。 -
<field>: <0 or false>
: 指定排除某个字段。
-
-
options
选项 -
返回值:
db.<collection>.find()
返回一个文档集合游标。在不迭代游标的情况下, 只列出前20
个文档。遍历完游标中所有的文档之后, 或者在10
分钟之后, 游标便会自动关闭。可以使用db.<collection>.find().noCursorTimeout()
函数来保持游标一直有效。最后需要我们通过db.<collection>.find().noCursorTimeout().close()
来关闭游标。
19.3 用法
db.user.find(); // 查询全部文档
db.user.find().pretty(); // 查询全部文档并格式化
db.user.find({ name: "李思思" }); // 全部匹配查询 筛选条件查询文档
db.user.find({ "_id.type": "1" }); // 全部匹配查询 复合主键筛选条件查询文档
db.user.find({ name: { $eq: "李思思"}}); // 比较查询 筛选条件查询文档
db.user.find({ name: { $ne: "李思思"}}); // 比较查询 筛选条件查询文档
db.user.find({ age: { $gt: 24 }}); // 比较查询 筛选条件查询文档
db.user.find({ age: { $lt: 24 }}); // 比较查询 筛选条件查询文档
db.user.find({ name: { $in: ["李思思", "张三"]} }); // 多个全部匹配 筛选条件查询文档
db.user.find({ name: { $nin: ["李思思", "张三"]} }); // 多个全部匹配 筛选条件查询文档
db.user.find({ name: { $not: { $eq: "李思思"}}}); // 逻辑查询 筛选条件查询文档
db.user.find({ $and: [ { age: { $lt: 24}}, { name: { $ne: "李思思"}} ] }); // 逻辑查询 筛选条件查询文档
db.user.find({ $or: [ { age: { $gt: 24 }}, { name: { $ne: "李思思"}}] }); // 逻辑查询 筛选条件查询文档
db.user.find({ $nor: [ { age: { $gt: 24 }}, { name: { $ne: "李思思"}}] }); // 逻辑查询 筛选条件查询文档
db.user.find({ age: { $lt: 23, $exists: true }}); // 元素查询 筛选条件查询文档
db.user.find({ age: { $type: ["number", "string", "null"] }}); // 元素查询 筛选条件查询文档
db.user.find({ like: { $all: ["篮球", "足球"] }}); // 数组查询 筛选条件查询文档
db.user.find({ like: { $elemMatch: { $eq: "篮球"} }}); // 数组查询 筛选条件查询文档
db.user.find({ lick: { $all: [ { $elemMatch: { $eq: "篮球" }}, { $elemMatch: { $eq: "足球"}}] }}); // 数组查询 筛选条件查询文档
db.user.find({ name: { $regex: /^李/, $options: "i"}}); // 运算查询 筛选条件查询文档
db.user.find({ name: "李思思", age: 23 }); // 多个筛选条件查询文档
db.user.find({ age: { $gt: 24, $lt: 28 }}); // 多个筛选条件查询文档
db.user.find({ age: { $lt: 24}, name: { $ne: "李思思"} }); // 多个筛选条件查询文档
db.user.find({ name: "李思思"}, { name: 1 }); // 只会返回 name 和 _id 字段
db.user.find({ name: "李思思"}, { _id: 0, name: 1 }); // 只会返回 name 字段
19.4 游标
db.collection.find()
方法返回一个游标。要访问文档,需要迭代游标。但是,在 mongosh
中,如果未使用 var
关键字将返回的游标分配给变量,则该游标会自动迭代多达 20
次 [1]
,最多可在结果中输出前 20
个文档。
游标遍历:
-
基于
next()
遍历游标: 可以使用游标方法next()
访问文档var myCursor = db.users.find( { type: 2 } );
while (myCursor.hasNext()) {
print(tojson(myCursor.next()));
} -
基于
forEach()
遍历游标: 使用游标方法forEach()
来迭代游标并访问文档var myCursor = db.users.find( { type: 2 } );
myCursor.forEach(printjson); -
基于
toArray()
遍历游标: 使用toArray()
方法遍历游标,并以数组形式返回文档。toArray()
方法会将游标返回的所有文档加载到RAM
中;toArray()
方法会耗尽游标。var myCursor = db.inventory.find( { type: 2 } );
var documentArray = myCursor.toArray();
var myDocument = documentArray[3];
游标行为: 从 MongoDB 5.0
开始,在客户端会话中创建的游标将在以下情况下关闭:相应的服务器会话以 killSessions
命令结束、会话超时或客户端已用尽游标时。
-
在会话外打开的游标: 会话下未打开的游标将在
10
分钟不活动后或客户端耗尽游标后自动关闭。要重写mongosh
中的这一行为,可以使用cursor.noCursorTimeout()
方法:var myCursor = db.users.find().noCursorTimeout();
设置
noCursorTimeout
选项后,必须使用cursor.close()
手动关闭游标,或者用尽游标的结果。 -
使用游标时的并发更新: 当游标返回文档时,其他操作可能会在背景运行并影响结果,具体取决于读关注(
read concern
)级别。
二十、db.collection.findAndModify()
20.1 认识
db.collection.findAndModify()
以原子方式修改并返回单个文档。
20.2 语法
db.collection.findAndModify({
query: <document>,
sort: <document>,
remove: <boolean>,
update: <document or aggregation pipeline>,
new: <boolean>,
fields: <document>,
upsert: <boolean>,
bypassDocumentValidation: <boolean>,
writeConcern: <document>,
maxTimeMS: <integer>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
let: <document> // Added in MongoDB 5.0
});
-
query
查询:-
匹配查询:
{ <field>: 指定值 }
-
比较操作符:
-
{ <field>: { $lt: <value> } }
-
{ <field>: { $gt: <value> } }
-
{ <field>: { $eq: <value> } }
-
{ <field>: { $ne: <value> } }
-
{ <field>: { $in: [<value1>, <value2>, ……] }}
-
{ <field>: { $nin: [<value1>, <value2>, ……] }}
-
{ <field>: { $lte: <value> } }
-
{ <field>: { $gte: <value> } }
-
-
逻辑操作符:
-
{ <field>: { $not: { <operator-expression> }}}
-
{ $or: [ {<expression>}, {<expression>}, ……]}
-
{ $nor: [ {<expression>}, {<expression>}, ……]}
-
{ $and: [ {<expression>}, {<expression>}, ……]}
或者{ <expression>, <expression>, …… }
-
-
字段操作符
-
{ <field>: { $exists: <boolean> }}
-
{ <field>: { $type: [<BSON type1>, <BSON type2>, ……]}}
-
-
数组操作符:
-
{ <field>: { $all: [ <value1>, <value2> …… ]}}
-
{ <field>: { $elemMatch: { <query1>, <query2>, ……}}}
-
-
运算操作符
{ <field>: { $regex: /pattern/, $options: <options> } }
-
-
sort
: 可选。 如果查询选择了多个文档,则确定操作更新哪个文档。按此参数指定的排序顺序更新第一个文档。 -
remove
: 布尔, 必须指定remove
或update
字段。删除query
字段中指定的文档。将此字段设置为true
可删除所选文档。默认值为false
。 -
update
: 文档或数组, 必须指定remove
或update
字段。执行所选文档的更新。
20.3 用法
二十一、db.collection.findOne()
21.1 认识
db.collection.findOne()
执行查询并返回单个文档。
21.2 语法
21.3 用法
二十二、db.collection.findOneAndDelete()
22.1 认识
db.collection.findOneAndDelete()
查找并更新单个文档。
22.2 语法
22.3 用法
二十三、db.collection.findOneAndReplace()
23.1 认识
db.collection.findOneAndReplace()
查找并更新单个文档。
23.2 语法
23.3 用法
二十四、db.collection.findOneAndUpdate()
24.1 认识
db.collection.findOneAndUpdate()
查找并更新单个文档。
24.2 语法
24.3 用法
二十五、db.collection.getIndexes()
25.1 认识
db.collection.getIndexes()
返回说明集合上现有索引的一组文档。
25.2 语法
25.3 用法
二十六、db.collection.getShardDistribution()
26.1 认识
db.collection.getShardDistribution()
对于分片集群中的集合,db.collection.getShardDistribution()
报告数据段分布的数据。
26.2 语法
26.3 用法
二十七、db.collection.getShardVersion()
27.1 认识
db.collection.getShardVersion()
分片集群的内部诊断方法。
27.2 语法
27.3 用法
二十八、db.collection.hideIndex()
28.1 认识
db.collection.hideIndex()
在查询规划器中隐藏索引。
28.2 语法
28.3 用法
二十九、db.collection.insertOne()
29.1 认识
db.collection.insertOne()
在集合中插入新文档。
29.2 语法
db.<collection>.insertOne(
<document>,
{
writeConcern: <document>
}
)
29.3 用法
如果没有 user
集合, 会自动创建该集合。另外, 可以通过 try {} catch(e){}
包裹命令。
db.user.insertOne( { _id: "user1", name: "柏拉文", age: 23 });
try { db.user.insertOne( { _id: "user2", name: "柏拉图", age: 24 })} catch(error){ print(error) }
三十、db.collection.insertMany()
30.1 认识
db.collection.insertMany()
在集合中插入多份新文档。
30.2 语法
db.<collection>.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
30.3 用法
如果没有 user
集合, 会自动创建该集合。另外, 可以通过 try {} catch(e){}
包裹命令。
db.user.insertMany([ { name: "王明", age: 25 }, { name: "张三", age: 28}]);
db.user1.insertMany([ { name: { firstName: "alice", lastName: "wong" }, balance: 50}, { name: { firstName: "bob", lastName: "yang" }, balance: 20}])
try{ db.user.insertMany([ { name: "王明", age: 25 }, { name: "张三", age: 28}]); } catch(error){ print(error) }
三十一、db.collection.isCapped()
31.1 认识
db.collection.isCapped()
报告集合是否为固定大小集合。
31.2 语法
31.3 用法
三十二、db.collection.latencyStats()
32.1 认识
db.collection.latencyStats()
返回集合的延迟统计信息。
32.2 语法
32.3 用法
三十三、db.collection.mapReduce()
33.1 认识
db.collection.mapReduce()
执行 map-reduce 样式的数据聚合。
33.2 语法
33.3 用法
三十四、db.collection.reIndex()
34.1 认识
db.collection.reIndex()
重新构建集合上的所有现有索引。
34.2 语法
34.3 用法
三十五、db.collection.remove()
35.1 认识
db.collection.remove()
从集合删除文档。
35.2 语法
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>,
collation: <document>,
let: <document> // Added in MongoDB 5.0
}
)
-
query
查询:-
匹配查询:
{ <field>: 指定值 }
-
比较操作符:
-
{ <field>: { $lt: <value> } }
-
{ <field>: { $gt: <value> } }
-
{ <field>: { $eq: <value> } }
-
{ <field>: { $ne: <value> } }
-
{ <field>: { $in: [<value1>, <value2>, ……] }}
-
{ <field>: { $nin: [<value1>, <value2>, ……] }}
-
{ <field>: { $lte: <value> } }
-
{ <field>: { $gte: <value> } }
-
-
逻辑操作符:
-
{ <field>: { $not: { <operator-expression> }}}
-
{ $or: [ {<expression>}, {<expression>}, ……]}
-
{ $nor: [ {<expression>}, {<expression>}, ……]}
-
{ $and: [ {<expression>}, {<expression>}, ……]}
或者{ <expression>, <expression>, …… }
-
-
字段操作符
-
{ <field>: { $exists: <boolean> }}
-
{ <field>: { $type: [<BSON type1>, <BSON type2>, ……]}}
-
-
数组操作符:
-
{ <field>: { $all: [ <value1>, <value2> …… ]}}
-
{ <field>: { $elemMatch: { <query1>, <query2>, ……}}}
-
-
运算操作符
{ <field>: { $regex: /pattern/, $options: <options> } }
-
-
options
:-
justOne
: 布尔, 可选。要将删除限制为仅删除一个文档,请设置为true
。忽略,使用默认值false
并删除所有符合删除条件的文档。 -
writeConcern
: 文档, 可选。 表达写关注(write concern
)的文档。省略使用默认写关注(write concern
)。 请参阅写关注。如果是在事务中运行,则请勿显式设置此操作的写关注。要将写关注与事务一起使用,请参阅事务和写关注。 -
collation
: 文档, 可选。指定用于操作的排序规则。排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。
-
35.3 用法
三十六、db.collection.renameCollection()
36.1 认识
db.collection.renameCollection()
更改集合的名称。
36.2 语法
36.3 用法
三十七、db.collection.replaceOne()
37.1 认识
db.collection.replaceOne()
替换集合中的单个文档。
37.2 语法
37.3 用法
三十八、db.collection.stats()
38.1 认识
db.collection.stats()
报告集合的状态。提供 collStats 的封装器。
38.2 语法
38.3 用法
三十九、db.collection.storageSize()
39.1 认识
db.collection.storageSize()
报告集合使用的总大小(以字节为单位)。提供 collStats 输出的 storageSize 字段的封装器。
39.2 语法
39.3 用法
四十、db.collection.totalIndexSize()
40.1 认识
db.collection.totalIndexSize()
报告集合上索引使用的总大小。提供 collStats 输出的 totalIndexSize 字段的封装器。
40.2 语法
40.3 用法
四十一、db.collection.totalSize()
41.1 认识
db.collection.totalSize()
报告集合的总大小,其中包括集合中所有文档和所有索引的大小。
41.2 语法
41.3 用法
四十二、db.collection.unhideIndex()
42.1 认识
db.collection.unhideIndex()
从查询规划器中取消隐藏索引。
42.2 语法
42.3 用法
四十三、db.collection.updateOne()
43.1 认识
db.collection.updateOne()
修改集合中的单个文档。
43.2 语法
43.3 用法
四十四、db.collection.updateMany()
44.1 认识
db.collection.updateMany()
修改集合中的多个文档。
44.2 语法
44.3 用法
四十五、db.collection.watch()
45.1 认识
db.collection.watch()
在集合上建立变更流。
45.2 语法
45.3 用法
四十六、db.collection.validate()
46.1 认识
db.collection.validate()
对集合执行诊断操作。
46.2 语法
46.3 用法
四十七、db.collection.update()
46.1 认识
db.collection.update()
修改集合中的一个或多个现有文档。该方法可以修改现有文档的特定字段,也可以完全替换现有文档,具体取决于更新参数。
46.2 语法
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>,
let: <document> // Added in MongoDB 5.0
}
)
-
query
查询:-
匹配查询:
{ <field>: 指定值 }
-
比较查询操作符:
-
{ <field>: { $lt: <value> } }
-
{ <field>: { $gt: <value> } }
-
{ <field>: { $eq: <value> } }
-
{ <field>: { $ne: <value> } }
-
{ <field>: { $in: [<value1>, <value2>, ……] }}
-
{ <field>: { $nin: [<value1>, <value2>, ……] }}
-
{ <field>: { $lte: <value> } }
-
{ <field>: { $gte: <value> } }
-
-
逻辑查询操作符:
-
{ <field>: { $not: { <operator-expression> }}}
-
{ $or: [ {<expression>}, {<expression>}, ……]}
-
{ $nor: [ {<expression>}, {<expression>}, ……]}
-
{ $and: [ {<expression>}, {<expression>}, ……]}
或者{ <expression>, <expression>, …… }
-
-
字段查询操作符
-
{ <field>: { $exists: <boolean> }}
-
{ <field>: { $type: [<BSON type1>, <BSON type2>, ……]}}
-
-
数组查询操作符:
-
{ <field>: { $all: [ <value1>, <value2> …… ]}}
-
{ <field>: { $elemMatch: { <query1>, <query2>, ……}}}
-
-
运算查询操作符
{ <field>: { $regex: /pattern/, $options: <options> } }
-
-
update
更新-
字段更新操作符:
-
{ $set: { <field1>: <newValue> …… }}
: 更新或新增字段 -
{ $set: { <field1>.$: <newValue> …… }}
: 更新或新增字段 -
{ $unset: { <field1>: "", …… }}
: 删除字段。注意: 删除数组中的元素时,只是会将该元素置为 null, 数组长度不会改变。 -
{ $rename: { <field1>: <newName1>, …… }}
: 重命名字段。$rename
命令会先$unset
旧字段, 然后$set
新字段 -
{ $inc: { <field1>: <newValue>, <field2>: <newValue> …… }}
: 加减字段值。注意, 只能应用在number
字段上。 -
{ $mul: { <field1>: <newValue>, <field2>: <newValue> …… }}
: 相乘字段值。注意, 只能应用在number
字段上。 -
{ $min: { <field1>: <newValue>, <field2>: <newValue> …… }}
: 比较减小字段值。 -
{ $max: { <field1>: <newValue>, <field2>: <newValue> …… }}
: 比较增大字段值。
-
-
数组更新操作符:
-
{ $set: { <field>.$: <newValue>…… }}
: 更新数组第一个元素 -
{ $set: { <field>.$[]: <newValue>…… }}
: 更新数组中所有元素 -
{ $addToSet: { <field>: value, …… } }
: 向数组中增添元素。注意: 如果要插入的值已经存在数组字段中, 则$addToSet
不会再添加重复值。但是, 要过插入的新值是数组或者对象时, 插入值的顺序和已有值一样的时候, 才算作重复值被忽略, 但凡顺序不一致, 就可以被添加。 -
{ $pop: { <field>: value, …… } }
: 从数组中移除元素。-1
为第一项。1
为最后一项。 -
{ $pull: { <field>: value, …… } }
: 从数组中有选择性地移除元素。 -
{ $pullAll: { <field>: value, …… } }
: 从数组中有选择性地移除元素。 -
{ $push: { <field>: value, …… } }
: 从数组中增添元素。如果$push
命令中指定的数组字段不存在, 这个字段会添加到原文档中。 -
{ $addToSet: { <field>: { $each: [ value, …… ]} } }
: 通过$each
将插入的数组扁平化, 分散为多个数组, 然后一一添加到数组中。 -
{ $push: { <field>: { $each: [ value, …… ]} } }
: 通过$each
将插入的数组扁平化, 分散为多个数组, 然后一一添加到数组中。 -
{ $push: { <field>: { $each: [ value, …… ]} , $position: 0 } }
: 通过$each
将插入的数组扁平化, 分散为多个数组, 然后一一添加到数组$position
下标索引后面。 -
{ $push: { <field>: { $each: [ value, …… ]} , $sort: 1 } }
: 通过$each
将插入的数组扁平化, 分散为多个数组, 然后一一添加到数组, 并且通过$sort
进行排序,1
为由低到高排序,-1
为由高到低排序。 -
{ $push: { <field>: { $each: [], $sort: -1 }}}
: 不添加任何数组元素, 只是对原有数组元素进行排序。 -
{ $push: { <field>: { $each: [<value> ……], $slice: value }}}
: 通过$each
将插入的数组扁平化, 分散为多个数组, 然后一一添加到数组, 并且通过$slice
对数组进行截取。 -
注意:
$sort
、$slice
、$position
三个执行顺序为:$position
、$sort
、$slice
-
-
-
options
选项:-
multi
: 可选。 如果设立true
,则更新符合query
条件的多个文档。 如果设立false
,则更新一个文档。 默认值为false
。 注意:MongoDB
只能保证单个文档操作的原子性, 不能保证多个文档操作的原子性。 -
upsert
: 可选。 当true update()
时, 如果没有文档与query
匹配,则创建一个新文档。如果upsert
和multi
均为true
,并且没有文档与查询匹配,则更新操作仅插入单个文档。要避免多次更新或插入,请确保query
字段具有唯一索引。默认值为false
, 即,在未找到匹配项时不插入新文档。
-
46.3 用法
// 更新并查询确认
db.user.update({ name: "剑姬"}, { $set: { name: "剑姬", age: 6400 } });
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑姬"}, { $set: { "like.0": "我的剑就是你的剑" }});
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑姬"}, { $set: { "like.1": "蠢货,你们已经输了" }});
db.user.find({ name: "剑姬" });
// 更新并查询确认
db.user.update({ name: "剑姬"}, { $unset: { age: "" }});
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑姬"}, { $unset: { "like.0": "" }}); // 注意: 删除数组中的元素时,只是会将该元素置为 null。数组长度不会改变。
db.user.find({ name: "剑姬" });
// 更新并查询确认
db.user.update({ name: "剑姬"}, { $rename: { like: "love" }});
db.user.find({ name: "剑姬" });
// 更新并查询确认
db.user.update({ name: "剑姬"}, { $inc: { age: 450 }});
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑圣"}, { $inc: { age: 1 }});
db.user.find({ name: "剑圣" });
db.user.update({ name: "剑姬" }, { $min: { age: 455 }});
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑姬" }, { $max: { age: 455 }});
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑姬" }, { $addToSet: { like: "嘻嘻" }});
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑姬" }, { $addToSet: { like: { $each: ["呵呵", "嗯嗯"]} }});
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑姬" }, { $pop: { like: -1 }});
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑姬" }, { $pop: { like: 1 }});
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑姬" }, { $pull: { like: "呵呵" }});
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑姬" }, { $pull: { like: { $regex: /呵呵/} }});
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑姬" }, { $pullAll: { like: { $in: ["呵呵", "嘻嘻"] } }});
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑姬" }, { $push: { like: { $each: ["呵呵", "嘻嘻", "哈哈" ], $position: 0} }});
db.user.find({ name: "剑姬" });
db.user.update({ name: "剑姬" }, { $push: { like: { $each: ["严世蕃"], $position: -2} }});
db.user.find({ name: "剑姬" });
四十八、db.collection.insert()
48.1 认识
db.collection.insert()
将一个或多个文档插入集合中。 此方法在 mongosh
中已弃用。
48.2 语法
db.<collection>.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
48.3 用法
db.user.insert( { name: "李思思", age: 23 });
db.user.insert( { _id: { type: 1 }, name: "李思思", age: 23 });
// try catch 包裹
try { db.user.insert( { name: "李思思", age: 23 }); } catch(error){ print(error) }
db.user.insert([ { name: "王明明", age: 25 }, { name: "张浅浅", age: 28}]);
// try catch 包裹
try{ db.user.insert([ { name: "王明明", age: 25 }, { name: "张浅浅", age: 28}]); } catch(error){ print(error) }
try { db.user.insert([ { name: "科比", age: 30, like: ["篮球","足球", "得分王"] }, { name: "乔丹", age: 28, like: ["篮球","足球", "得分王"] }]); } catch(error){ print(error) }
四十九、db.collection.save()
49.1 认识
db.collection.save()
如果 document
文档中包含了 _id
字段, save()
命令将会调用 db.collection.update()
命令, 并且传入参数 upsert: true
。