参考文档
数据库
创建数据库
# 进入mongo
> mongo
# 切换到 admin 库
> use admin;
# 管理员认证
> db.auth('useradmin', 'adminpassword');
# 创建数据库
> use test_one_db;
use DATABASE_NAME
指令:如果数据库不存在,则创建数据库,否则切换到指定数据库。当使用
user test_one_db
命令时,test_one_db
其实是存放在内存中的,当test_one_db
中存在一个collection
之后,mongo
才会将这个数据库持久化到硬盘之中。删除数据库
> db.dropDatabase()
{ "ok" : 1 }
-
集合
创建集合
动态创建 MongoDB 中的集合
使用 db.
.insertOne() 向集合中添加一个文档, 参数一个 json 格式的文档 使用 db.
.insertMany() 向集合中添加多个文档, 参数为 json 文档数组 // 向集合中添加一个文档
db.collection.insertOne(
{ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
// 向集合中添加多个文档
db.collection.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])
当我们向
collection
中插入document
文档时, 如果没有给文档指定_id
属性, 那么数据库会为文档自动添加_id
field, 并且值类型是ObjectId(blablabla)
, 就是文档的唯一标识, 类似于 relational database 里的primary key
- mongo 中的数字, 默认情况下是
double
类型, 如果要存整型, 必须使用函数NumberInt
(整型数字), 否则取出来就有问题了 - 插入当前日期可以使用
new Date()
在插入文档之前使用选项创建集合
name是集合名称,options是一个可选字段,我们可以用它来指定集合中的某些参数,如大小,文档的最大数量等。db.createCollection(name, options)
首先让我们看看这个命令如何用于创建没有任何参数的集合:db.createCollection("students")
{ "ok" : 1 }
让我们看看我们在创建集合时可以提供的选项:
capped:类型:布尔值。此参数仅为true和false。这指定了集合可以拥有的最大条目的上限。一旦集合达到该限制,它就会开始覆盖旧条目。
这里需要注意的是,将capped选项设置为true时,您还必须指定size参数。
size:类型:数字。指定集合的最大大小(上限集合),以字节为单位。
max:类型:数字。指定集合可容纳的最大文档数。
autoIndexId:类型:布尔值。此参数的默认值为false。如果将其设置为true,则会自动为每个文档创建索引字段
_id。
此命令将创建名为teachers的集合,其最大大小为db.createCollection("teachers", { capped : true, size : 9232768} )
{ "ok" : 1 }
9232768
字节。一旦此集合达到该限制,它将开始覆盖旧条目。删除集合
db.<collection_name>.drop();
```powershelluse beginnersbookdb switched to db beginnersbookdb
show collections beginnersbook students teachers
db.teachers.drop() true
show collections beginnersbook students ``` 命令db.teachers.drop()返回true,这意味着该集合已成功删除。我们在删除后使用show collections命令验证了同样的事情,如上所示。
![]()
插入数据
- 使用
db.<collection_name>.insertOne()
向集合中添加一个文档, 参数一个 json 格式的文档 - 使用
db.<collection_name>.insertMany()
向集合中添加多个文档, 参数为 json 文档数组 - 使用
~~db.<collection_name>.insert()~~
将一个或多个文档插入到集合中(弃用,改为db.collection.insertOne()或 db.collection.replaceOne()代替。根据_id
字段是否存在而决定是执行插入方法还是修改方法)。 - 使用
db.<collection_name>.insert()
将一个或多个文档插入到集合中。
以下方法还可以将新文档添加到集合中:
- db.collection.update()与该 选项一起使用时。upsert: true
- 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.save()。
- db.collection.bulkWrite()。
更多插入方式请查阅:https://mongodb.net.cn/manual/reference/insert-methods/
// 向集合中添加一个文档
db.collection.insertOne(
{ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
// 向集合中添加多个文档
db.collection.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])
// 向集合中添加多个文档
> db.create_list_test.insert([{name: 'leo', age: 24, sex: 'man'}, {name: 'arya', age: 27, sex: 'woman'}], {ordered: false})
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
- 当我们向
collection
中插入document
文档时, 如果没有给文档指定_id
属性, 那么数据库会为文档自动添加_id
field, 并且值类型是ObjectId(blablabla)
, 就是文档的唯一标识, 类似于 relational database 里的primary key
- mongo 中的数字, 默认情况下是
double
类型, 如果要存整型, 必须使用函数NumberInt
(整型数字), 否则取出来就有问题了 - 插入当前日期可以使用
new Date()
如果某条数据插入失败, 将会终止插入, 但已经插入成功的数据不会回滚掉. 因为批量插入由于数据较多容易出现失败, 因此, 可以使用 try catch 进行异常捕捉处理, 测试的时候可以不处理.如:
try {
db.comment.insertMany([
{"_id":"1","articleid":"100001","content":"我们不应该把清晨浪费在手机上, 健康很重要, 一杯温水幸福你我 他.","userid":"1002","nickname":"相忘于江湖","createdatetime":new Date("2019-0805T22:08:15.522Z"),"likenum":NumberInt(1000),"state":"1"},
{"_id":"2","articleid":"100001","content":"我夏天空腹喝凉开水, 冬天喝温开水","userid":"1005","nickname":"伊人憔 悴","createdatetime":new Date("2019-08-05T23:58:51.485Z"),"likenum":NumberInt(888),"state":"1"},
{"_id":"3","articleid":"100001","content":"我一直喝凉开水, 冬天夏天都喝.","userid":"1004","nickname":"杰克船 长","createdatetime":new Date("2019-08-06T01:05:06.321Z"),"likenum":NumberInt(666),"state":"1"},
{"_id":"4","articleid":"100001","content":"专家说不能空腹吃饭, 影响健康.","userid":"1003","nickname":"凯 撒","createdatetime":new Date("2019-08-06T08:18:35.288Z"),"likenum":NumberInt(2000),"state":"1"},
{"_id":"5","articleid":"100001","content":"研究表明, 刚烧开的水千万不能喝, 因为烫 嘴.","userid":"1003","nickname":"凯撒","createdatetime":new Date("2019-0806T11:01:02.521Z"),"likenum":NumberInt(3000),"state":"1"}
]);
} catch (e) {
print (e);
}
查询集合
- 使用
db.<collection_name>.find()
方法对集合进行查询, 接受一个 json 格式的查询条件. 返回的是一个数组 db.<collection_name>.findOne()
查询集合中符合条件的第一个文档, 返回的是一个对象
其他带有查询功能的方法(带有修改、增加功能):
https://mongodb.net.cn/manual/reference/method/db.collection.find/#db.collection.find
- db.create_list_test.findOneAndReplace()
- db.create_list_test.findAndModify()
- db.create_list_test.findOneAndDelete()
- db.create_list_test.findOneAndUpdate()
文本格式化输出
使用以下命令格式化 JSON 格式的输出:
db.students.find().forEach(printjson);
db.students.find().forEach(printjson);
db.students.find().pretty();
find()、findOne()方法带查询条件
运算符表:
其他请参考:https://mongodb.net.cn/manual/reference/operator/query/
表达式 | 语义 |
---|---|
$gt | great than大于 > |
$lt | less than小于 < |
$gte | great than equals大于等于 >= |
$lte | 小于等于 <= |
$ne | not equals不等于<> |
$in | 在某一个集合里 |
$nin | 不在某一个集合中 |
$exists | 验证一个元素是否存在 |
正则表达式 | 支持(可理解为模糊匹配) |
$elemMatch | 匹配数组内的元素 |
user.score | 查询嵌套对象的值(左为示例user列中score对象的值) |
$not | 取反 |
$all | 匹配所有 |
$size | 匹配数组大小 |
$slice | 返回数组的一个子集,即对以某属性为基础,返回多少条(范围)。也可以接受偏移值和要返回的元素数量,来返回中间的结果 |
$where | 可执行任务JavaScript作为查询的一部分,可为function也可为字符串,查询较慢 |
等值查询
在查询过滤文档中使用<字段>:<值>表达式实现等值查询:
{ <field1>: <value1>, ... }
下面的案例返回inventory集合中status等于“D”**的所有文档:
db.inventory.find( { status: "D" } )
上述操作对应如下SQL语句:
SELECT * FROM inventory WHERE status = "D"
查询条件中使用查询操作符
{ <field1>: { <operator1>: <value1> }, ... }
下面的案例返回inventory集合中status等于“A”或“D”的所有文档。
db.inventory.find( { status: { $in: [ "A", "D" ] } } )
Note: 尽管可以使用$or操作符来满足上述需求,但是在对相同字段进行等值检索的时候更建议使用$in。 上述操作对应如下SQL:
SELECT * FROM inventory WHERE status in ("A", "D")
有关MongoDB查询运算符的完整列表,请参考查询和映射操作符
AND条件
可以指定文档中的多个字段作为查询条件。在查询语句中使用AND连接多个查询条件来检索集合中满足所有查询条件的文档(,
相当于 AND
)。
下面的案例返回inventory集合中status等于“A” 并且qty小于($lt)30的所有文档:
db.inventory.find( { status: "A", qty: { $lt: 30 } } )
上述操作对应如下SQL:
SELECT * FROM inventory WHERE status = "A" AND qty < 30
关于MongoDB的比较操作符可以参考比较操作符
OR条件
使用$or运算符,可以指定一个联合查询,该查询将每个子句与逻辑 OR 连接起来,以便查询选择集合中至少匹配一个条件的文档。
下面的案例返回inventory集合中status等于“A” 或者qty小于($lt)30的所有文档。
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
上述操作对应如下SQL:
SELECT * FROM inventory WHERE status = "A" OR qty < 30
Note: 使用比较操作符的查询受Type Bracketing的约束。
同时使用AND和OR条件
下面的案例返回inventory集合中status等于“A” 并且qty小于 ($lt) 30或者item 是以p字符开头的所有文档。
db.inventory.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )
上述操作对应如下SQL:
SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")
Note: MongoDB支持正则表达式操作符$regex来做字符串模式匹配。
正则表达式查询方式
// 正则表达式查询(查找名字中以 “沐” 开头的记录)
db.student.find({"name": /^沐/g})
// 相当于:select * from student where name like '沐%';
// 正则表达式查询(查找名字中包含 “沐” 的记录)
db.student.find({"name": /沐/g})
// 相当于:select * from student where name like '%沐%';
子文档查询
db.student.find({"score.shuxue": 60 });
// 子文档查询
db.student.find({"score": {"shuxue": 60 }});
// 多个子文档查询 $elemMatch 表示必须是同一个子对象满足多个条件
db.student.find({"score": {$elemMatch: {"yuwen": 80, "shuxue": 60, "yinyu": 70 });
find()、findOne()查询返回指定字段
db.user.find(query, projection)
projection:可选的。指定要在与查询过滤器匹配的文档中返回的字段。要返回匹配文档中的所有字段,请省略此参数。
{ field1: <value>, field2: <value> ... }
该
- 1或true将该字段包括在退货单据中。
- 0或false排除该字段。
注意 对于该id字段,您不必显式指定要返回该字段。除非您指定禁止显示该字段,否则该方法始终返回_id字段。_id: 1_idfind()_id: 0 一个projection 不能包含两个包含和排除的规范,除了排除_id领域。在明确包含字段的投影中,该_id字段是您可以明确排除_的唯一字段。
下表显示了与从表中读取记录和相应的MongoDB语句相关的各种SQL语句。
SQL SELECT语句 | MongoDB find()语句 |
---|---|
SELECT * FROM people | db.people.find() |
SELECT id, user_id, status FROM people | db.people.find( { }, { user_id: 1, status: 1 } ) |
SELECT user_id, status FROM people | db.people.find( { }, { user_id: 1, status: 1, _id: 0 } ) |
SELECT * FROM people WHERE status = “A” | db.people.find( { status: “A” } ) |
SELECT user_id, status FROM people WHERE status = “A” | db.people.find( { status: “A” }, { user_id: 1, status: 1, _id: 0 } ) |
SELECT * FROM people WHERE status != “A” | db.people.find( { status: { $ne: “A” } } ) |
SELECT * FROM people WHERE status = “A” AND age = 50 | db.people.find( { status: “A”, age: 50 } ) |
SELECT * FROM people WHERE status = “A” OR age = 50 | db.people.find( { $or: [ { status: “A” } , { age: 50 } ] } ) |
SELECT * FROM people WHERE age > 25 | db.people.find( { age: { $gt: 25 } } ) |
SELECT * FROM people WHERE age < 25 | db.people.find( { age: { $lt: 25 } } ) |
SELECT * FROM people WHERE age > 25 AND age <= 50 | db.people.find( { age: { $gt: 25, $lte: 50 } } ) |
SELECT * FROM people WHERE user_id like “%bc%” | db.people.find( { user_id: /bc/ } ) -要么- db.people.find( { user_id: { $regex: /bc/ } } ) |
SELECT * FROM people WHERE user_id like “bc%” | db.people.find( { user_id: /^bc/ } ) -要么- db.people.find( { user_id: { $regex: /^bc/ } } ) |
SELECT * FROM people WHERE status = “A” ORDER BY user_id ASC | db.people.find( { status: “A” } ).sort( { user_id: 1 } ) |
SELECT * FROM people WHERE status = “A” ORDER BY user_id DESC | db.people.find( { status: “A” } ).sort( { user_id: -1 } ) |
SELECT COUNT(*) FROM people | db.people.count() 要么 db.people.find().count() |
SELECT COUNT(user_id) FROM people | db.people.count( { userid: { $exists: true } } ) 要么_ db.people.find( { user_id: { $exists: true } } ).count() |
SELECT COUNT(*) FROM people WHERE age > 30 | db.people.count( { age: { $gt: 30 } } ) 要么 db.people.find( { age: { $gt: 30 } } ).count() |
SELECT DISTINCT(status) FROM people | db.people.aggregate( [ { $group : { _id : “$status” } } ] ) 或者,对于不超过BSON大小限制的不同值集 db.people.distinct( “status” ) |
SELECT * FROM people LIMIT 1 | db.people.findOne() 要么 db.people.find().limit(1) |
SELECT * FROM people LIMIT 5 SKIP 10 | db.people.find().limit(5).skip(10) |
EXPLAIN SELECT * FROM people WHERE status = “A” | db.people.find( { status: “A” } ).explain() |
在mongoShell中迭代游标
方法返回一个游标。 要访问文档,您需要迭代游标。 但是,在mongo shell中,如果未使用var关键字将返回的游标分配给变量,则该游标将自动迭代多达20次,以打印结果中的前20个文档。
手动迭代游标
在mongo shell中,当使用var关键字将find() 方法返回的游标分配给变量时,游标不会自动进行迭代。
您可以在shell程序中调用cursor变量以进行多达20次迭代并打印匹配的文档,如以下示例所示:
var myCursor = db.users.find( { type: 2 } );
myCursor
还可以使用cursor方法next()访问文档,如以下示例所示:
var myCursor = db.users.find( { type: 2 } );
while (myCursor.hasNext()) {
printjson(myCursor.next());
}
可以使用游标方法forEach()来迭代游标并访问文档,如下例所示:
var myCursor = db.users.find( { type: 2 } );
myCursor.forEach(printjson);
有关游标方法的更多信息,请参阅JavaScript游标方法和 driver程序文档。
迭代器索引
在 mongo shell中,可以使用 toArray() 方法来迭代游标并以数组形式返回文档,如下所示:
var myCursor = db.inventory.find( { type: 2 } );
var documentArray = myCursor.toArray();
var myDocument = documentArray[3];
toArray() 方法将游标返回的所有文档加载到RAM中; toArray() 方法耗尽游标。
另外,某些驱动程序通过使用游标上的索引(即**cursor [index]**
)来提供对文档的访问。 这是先调用toArray() 方法,然后在结果数组上使用索引的快捷方式。
游标行为
关闭非活动游标
默认情况下,服务器将在闲置10分钟或客户端用尽光标后自动关闭光标。要在mongo外壳程序中覆盖此行为,可以使用以下cursor.noCursorTimeout()方法:
var myCursor = db.users.find().noCursorTimeout();
设置该noCursorTimeout选项后,必须使用cursor.close()或通过用尽光标的结果来关闭光标。
有关设置选项的信息,请参见驱动程序文档noCursorTimeout。
光标隔离
光标批次
MongoDB服务器批量返回查询结果。批处理中的数据量将不超过BSON文档的最大大小。要覆盖批次的默认大小,请参见batchSize()和 limit()。
在新版本3.4:类型的操作find(), aggregate(), listIndexes,和 listCollections最大的每批16兆字节返回。batchSize()可以强制执行一个较小的限制,但不能执行较大的限制。
find()并且aggregate()操作的初始批处理大小默认为101个文档。getMore 针对结果游标发出的后续操作没有默认的批处理大小,因此它们仅受16 MB消息大小的限制。
对于包含不带索引的排序操作的查询,服务器必须在返回任何结果之前将所有文档加载到内存中以执行排序。
当您遍历游标并到达返回批次的末尾时,如果还有更多结果,cursor.next()将执行来检索下一个批次。若要查看在迭代游标时批处理中剩余多少文档,可以使用方法,如以下示例所示:getMoreoperationobjsLeftInBatch()
var myCursor = db.inventory.find();
var myFirstDocument = myCursor.hasNext() ? myCursor.next() : null;
myCursor.objsLeftInBatch();
光标信息
该db.serverStatus()方法返回包含metrics字段的文档。该 metrics字段包含metrics.cursor具有以下信息的 字段:
- 自上次服务器重新启动以来超时的游标数
- DBQuery.Option.noTimeout设置了选项以防止一段时间不活动后超时的打开游标的数量
- “固定”打开游标的数量
- 打开的游标总数
考虑以下示例,该示例调用 db.serverStatus()方法并metrics从结果中访问字段,然后从cursor字段中访问metrics 字段:
db.serverStatus().metrics.cursor
结果是以下文档:
{
"timedOut" : <number>
"open" : {
"noTimeout" : <number>,
"pinned" : <number>,
"total" : <number>
}
}
也可以看看
db.serverStatus()
更新集合
MongoDB提供了以下方法来更新集合中的文档:
db.collection.updateOne() | 即使多个文档可能与指定的过滤器匹配,也最多更新一个与指定的过滤器匹配的文档。 3.2版中的新功能。 |
---|---|
db.collection.updateMany() | 更新所有与指定过滤器匹配的文档。 3.2版中的新功能。 |
db.collection.replaceOne() | 即使多个文档可能与指定过滤器匹配,也最多替换一个与指定过滤器匹配的文档。 3.2版中的新功能。 |
db.collection.update() | 更新或替换与指定过滤器匹配的单个文档,或更新与指定过滤器匹配的所有文档。 默认情况下,该db.collection.update()方法更新单个文档。要更新多个文档,请使用multi选项。 |
以下方法还可以更新集合中的文档:
- db.collection.findOneAndReplace()。
- db.collection.findOneAndUpdate()。
- db.collection.findAndModify()。
- db.collection.save()。
- db.collection.bulkWrite()。
更新运算符
请参考:https://mongodb.net.cn/manual/reference/operator/update/字段
| 名称 | 描述 | | —- | —- | | $currentDate | 将字段的值设置为当前日期(日期或时间戳)。 | | $inc | 将字段的值增加指定的数量。 | | $min | 仅当指定值小于现有字段值时才更新该字段。 | | $max | 仅当指定值大于现有字段值时才更新该字段。 | | $mul | 将字段的值乘以指定的数量。 | | $rename | 重命名字段。 | | $set | 设置文档中字段的值。 | | $setOnInsert | 如果更新导致插入文档,则设置字段的值。对修改现有文档的更新操作没有影响。 | | $unset | 从文档中删除指定的字段。 |
数组
运算符
名称 | 描述 |
---|---|
$ | 充当占位符,以更新与查询条件匹配的第一个元素。 |
$[] | 充当占位符,以更新匹配查询条件的文档的数组中的所有元素。 |
$[ |
充当占位符,以更新arrayFilters与查询条件匹配的文档中所有与条件匹配的元素。 |
$addToSet | 仅当元素不存在于集合中时才将它们添加到数组中。 |
$pop | 删除数组的第一项或最后一项。 |
$pull | 删除所有与指定查询匹配的数组元素。 |
$push | 将项目添加到数组。 |
$pullAll | 从数组中删除所有匹配的值。 |
修饰符
名称 | 描述 |
---|---|
$each | 修改$push 和$addToSet 运算符以附加多个项以进行数组更新。 |
$position | 修改$push 运算符以指定要添加元素的数组中的位置。 |
$slice | 修改$push 运算符以限制更新数组的大小。 |
$sort | 修改$push 运算符以对存储在数组中的文档重新排序。 |
按位
名称 | 描述 |
---|---|
$bit | 执行按位AND,OR和XOR整数值的更新。 |
聚合管道更新
使用聚合管道允许使用表达性更强的update语句,比如根据当前字段值表示条件更新,或者使用另一个字段的值更新一个字段。
从MongoDB 4.2开始,您可以使用聚合管道在以下位置进行更新:
运算符
阶段 | 描述 |
---|---|
$addFields | 将新字段添加到文档。与相似 $project,$addFields重塑流中的每个文档;具体而言,通过向输出文档添加新字段,该文档既包含输入文档中的现有字段,又包含新添加的字段。 $set是的别名$addFields。 |
$bucket | 根据指定的表达式和存储区边界将传入文档分类为多个组,称为存储区。 |
$bucketAuto | 根据指定的表达式将传入文档分类为特定数量的组,称为存储桶。自动确定存储区边界,以尝试将文档平均分配到指定数量的存储区中。 |
$collStats | 返回有关集合或视图的统计信息。 |
$count | 返回聚合管道此阶段的文档数计数。 |
$facet | 在同一阶段的同一组输入文档上处理多个聚合管道 。支持在一个阶段中创建能够表征多维或多面数据的多面聚合。 |
$geoNear | 根据与地理空间点的接近程度返回有序的文档流。包含 $match ,$sort 和$limit 用于地理空间数据的功能。输出文档包括附加距离字段,并且可以包括位置标识符字段。 |
$graphLookup | 对集合执行递归搜索。向每个输出文档添加一个新的数组字段,其中包含对该文档的递归搜索的遍历结果。 |
$group | 按指定的标识符表达式对输入文档进行分组,并将累加器表达式(如果指定)应用于每个组。消耗所有输入文档,并在每个不同的组中输出一个文档。输出文档仅包含标识符字段,如果指定,还包含累积字段。 |
$indexStats | 返回有关集合每个索引使用情况的统计信息。 |
$limit | 将未修改的前n个文档传递到管道,其中n是指定的限制。对于每个输入文档,输出一个文档(对于前n个文档)或零文档(在前n个文档之后)。 |
$listSessions | 列出所有活动时间已经足够长以传播到system.sessions集合的会话。 |
$lookup | 对同一数据库中的另一个集合执行左外部 联接,以过滤“联接”集合中的文档以进行处理。 |
$match | 筛选文档流,以仅允许匹配的文档未经修改地传递到下一个管道阶段。 $match 使用标准的MongoDB查询。对于每个输入文档,输出一个文档(匹配)或零文档(不匹配)。 |
$merge | 将聚合管道的结果文档写入集合。该阶段可以将结果合并(插入新文档,合并文档,替换文档,保留现有文档,使操作失败,使用自定义更新管道处理文档)将结果合并到输出集合中。要使用该$merge阶段,它必须是管道中的最后一个阶段。 4.2版中的新功能。 |
$out | 将聚合管道的结果文档写入集合。要使用该$out 阶段,它必须是管道中的最后一个阶段。 |
$planCacheStats | 返回集合的计划缓存 信息。 |
$project | 重塑流中的每个文档,例如通过添加新字段或删除现有字段。对于每个输入文档,输出一个文档。 另请参阅$unset删除现有字段。 |
$redact | 通过基于文档本身中存储的信息限制每个文档的内容,来重塑流中的每个文档。包含$project 和的功能 $match 。可用于实施字段级修订。对于每个输入文档,输出一个或零个文档。 |
$replaceRoot | 用指定的嵌入式文档替换文档。该操作将替换输入文档中的所有现有字段,包括该_id字段。指定嵌入在输入文档中的文档以将嵌入的文档提升到顶层。 $replaceWith是$replaceRoot舞台的别名 。 |
$replaceWith | 用指定的嵌入式文档替换文档。该操作将替换输入文档中的所有现有字段,包括该_id字段。指定嵌入在输入文档中的文档以将嵌入的文档提升到顶层。 $replaceWith是$replaceRoot舞台的别名 。 |
$sample | 从其输入中随机选择指定数量的文档。 |
$set | 将新字段添加到文档。与相似 $project,$set重塑流中的每个文档;具体而言,通过向输出文档添加新字段,该文档既包含输入文档中的现有字段,又包含新添加的字段。 $set是$addFields舞台的别名。 |
$skip | 跳过前n个文档,其中n是指定的跳过编号,并将其余未修改的文档传递到管道。对于每个输入文档,输出零个文档(对于前n个文档)或一个文档(如果在前n个文档之后)。 |
$sort | 通过指定的排序键对文档流重新排序。只有顺序改变;这些文档保持不变。对于每个输入文档,输出一个文档。 |
$sortByCount | 根据指定表达式的值对传入文档进行分组,然后计算每个不同组中的文档数。 |
$unset | 从文档中删除/排除字段。 $unset是$project删除字段的阶段的别名。 |
$unwind | 从输入文档中解构一个数组字段,以输出每个元素的文档。每个输出文档用元素值替换数组。对于每个输入文档,输出n个文档,其中n是数组元素的数量,对于空数组可以为零。 |
删除
MongoDB提供了以下删除集合文档的方法:
db.collection.deleteOne() | 即使多个文档可能与指定过滤器匹配,也最多删除一个与指定过滤器匹配的文档。 3.2版中的新功能。 |
---|---|
db.collection.deleteMany() | 删除所有与指定过滤器匹配的文档。 3.2版中的新功能。 |
db.collection.remove() | 删除单个文档或与指定过滤器匹配的所有文档。 |
以下方法也可以从集合中删除文档:
- db.collection.findOneAndDelete()。findOneAndDelete() 提供了一个排序选项。该选项允许删除按指定顺序排序的第一个文档。
- db.collection.findAndModify()。db.collection.findAndModify()提供排序选项。该选项允许删除按指定顺序排序的第一个文档。
- db.collection.bulkWrite()。
批量写入操作
总览
MongoDB使客户端能够批量执行写操作。批量写入操作会影响单个集合。MongoDB允许应用程序确定批量写入操作所需的可接受的确认级别。
3.2版本新增 该db.collection.bulkWrite()方法提供了执行批量插入,更新和删除操作的能力。MongoDB还支持通过批量插入db.collection.insertMany()。
有序 VS 无序操作
批量写操作可以是有序的,也可以无序的。
使用操作的有序列表,MongoDB串行地执行操作。 如果在某个单独的写操作的处理过程中发生错误,MongoDB将直接返回而不再继续处理列表中任何剩余的写操作。 请参考有序的批量写入.
使用无序的操作列表,MongoDB可以并行地执行操作,但是不能保证此行为。 如果某个单独的写操作的处理过程中发生错误,MongoDB将继续处理列表中剩余的写操作。 请参考无序的批量写入。
在分片集合上执行有序的批量写操作通常比执行无序批量写操作要慢。这是因为对于有序列表而言,每个操作都必须等待上一个操作完成后才能执行。
默认情况下,bulkWrite()执行ordered 操作。要指定unordered写操作,请在选项文档中进行设置 。ordered : false
bulkWrite()方法
bulkWrite() 支持以下写操作:
每个写操作都bulkWrite()作为文档传递到数组中。
可重试写入
可重试读取
查询排序
使用sort()方法对文档进行排序
使用sort()方法,您可以根据文档的特定字段按升序或降序对文档进行排序。
sort()方法的语法:
1 表示升序,-1 表示降序。默认值为 1。
db.collecttion_name.find().sort({field_key:1 or -1})
还可以根据不想显示的字段对文档进行排序:例如,可以根据student_id对文档进行排序,并显示student_age和student_name字段。
查询 limit()、skip()
limit()
语法:
db.collection_name.find().limit(number_of_documents)
使用limit()方法限制结果中的文档:
不希望所有符合条件的文档。只想选择一些文档,然后可以使用limit()方法来限制文档的数量。例如,如果我只想输出一个文档,那么我会这样做:
db.collection_name.find().limit(1)
skip()
skip()方法用于在查询结果中跳过给定数量的文档。
语法:
db.collection_name.find().skip(1)
整合使用
根据 age
降序排序跳过第一条后拿取一条。
db.create_list_test.find().sort( { "age": -1 } ).limit(1).skip(1)
常用命令小结
选择切换数据库:use articledb
插入数据:db.comment.insert({bson数据})
查询所有数据:db.comment.find();
条件查询数据:db.comment.find({条件})
查询符合条件的第一条记录:db.comment.findOne({条件})
查询符合条件的前几条记录:db.comment.find({条件}).limit(条数)
查询符合条件的跳过的记录:db.comment.find({条件}).skip(条数)
修改数据:db.comment.update({条件},{修改后的数据})
或
db.comment.update({条件},{$set:{要修改部分的字段:数据})
修改数据并自增某字段值:db.comment.update({条件},{$inc:{自增的字段:步进值}})
删除数据:db.comment.remove({条件})
统计查询:db.comment.count({条件})
模糊查询:db.comment.find({字段名:/正则表达式/})
条件比较运算:db.comment.find({字段名:{$gt:值}})
包含查询:db.comment.find({字段名:{$in:[值1, 值2]}})
或
db.comment.find({字段名:{$nin:[值1, 值2]}})
条件连接查询:db.comment.find({$and:[{条件1},{条件2}]})
或
db.comment.find({$or:[{条件1},{条件2}]})