ToB企服应用市场:ToB评测及商务社交产业平台

标题: MongoDB - 增删改查 [打印本页]

作者: 王國慶    时间: 2022-11-17 04:09
标题: MongoDB - 增删改查
连接

标准 URI 连接语法

通常,可以设定标准的 URI 连接语法,作为连接配置:
  1. mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
复制代码
连接选项

标准的连接格式包含了多个选项,如下所示:
连接命令格式

使用 mongosh 连接 MongoDB 时,也支持命令选项的方式添加配置:
插入文档

插入校验

MongoDB 会对要插入的数据进行最基本的检查:检查文档的基本结构,如缺少 _id 键会自动添加一个、是否包含非 UTF-8 字符、是否使用了无法识别的类型、检查文档大小等。
其中,检查文档大小主要因为 MongoDB 限制了所有文档必须小于 16MB,主要是为了防止不良的模式设计并确保性能上的一致。
要查看文档的 BSON 大小,可以在 shell 中执行 Object.bsonsize(doc) 查看字节大小。
单个插入

官方文档:db.collection.insertOne() — MongoDB Manual
  1. db.collection.insertOne(
  2.     <document>,
  3.     {
  4.         writeConcern: <document>
  5.     }
  6. )
复制代码
批量插入

官方文档:db.collection.insertMany() — MongoDB Manual
  1. db.collection.insertMany(
  2.     [ <document 1> , <document 2>, ... ],
  3.     {
  4.         writeConcern: <document>,
  5.         ordered: <boolean>
  6.      }
  7. )
复制代码
通过传输 ordered=true 可以确保文档按提供的顺序插入,指定为 false 则允许 MongoDB 重新排列插入的顺序以提高性能,默认为 true 值。
以有序插入的方式使用 insertMany 出现错误将会阻塞后续的插入动作,无需插入的方式则不管其他插入是否出现了错误。
删除文档

单个删除

官方文档:db.collection.deleteOne() — MongoDB Manual
  1. db.collection.deleteOne(
  2.     <filter>,
  3.     {
  4.          writeConcern: <document>,
  5.          collation: <document>,
  6.          hint: <document|string>    // Available starting in MongoDB 4.4
  7.     }
  8. )
复制代码
使用 hint 参数可以指定 filter 查询时命中的索引,这对于复杂的索引结构时可以提升部分效率。
批量删除

官方文档:db.collection.deleteMany() — MongoDB Manual
  1. db.collection.deleteMany(
  2.     <filter>,
  3.     {
  4.          writeConcern: <document>,
  5.          collation: <document>,
  6.          hint: <document|string>    // Available starting in MongoDB 4.4
  7.     }
  8. )
复制代码
单个删除并返回

官方文档:db.collection.findOneAndDelete() — MongoDB Manual
  1. db.collection.findOneAndDelete(
  2.     <filter>,
  3.     {
  4.         writeConcern: <document>,
  5.         projection: <document>,
  6.         sort: <document>,
  7.         maxTimeMS: <number>,
  8.         collation: <document>
  9.     }
  10. )
复制代码
更新文档

更新文档是原子操作:如果两个更新同时发生,那么首先到达服务器的更新会先被执行,然后再执行下一个更新。
因此,相互冲突的更新可以安全地迅速接连完成,而不会破坏任何文档:最后一次更新将“成功”。如果不想使用默认行为,则可以考虑使用文档版本控制模式。
单个更新

官方文档:db.collection.updateOne() — MongoDB Manual
  1. db.collection.updateOne(
  2.     <filter>,
  3.     <update>,
  4.     {
  5.         upsert: <boolean>,
  6.         writeConcern: <document>,
  7.         collation: <document>,
  8.         arrayFilters: [ <filterdocument1>, ... ],
  9.         hint:  <document|string>    // Available starting in MongoDB 4.2.1
  10.     }
  11. )
复制代码
在更新文档的时候,比较需要注意的事 upsert 的使用,其是一种特殊类型的更新:如果找不到与筛选条件相匹配的文档,则会以这个条件和更新文档为基础来创建一个新文档;如果找到了匹配的文档,则进行正常的更新。
因此,使用 upsert 的好处就是,可以使用同一套代码创建和更新文档。
使用 upsert 时就涉及到一个 $setOnInsert 运算符,它的作用是,只会在插入文档时设置字段的值,在后续的更新时不对其进行更改。
批量更新

官方文档:db.collection.updateMany() — MongoDB Manual
  1. db.collection.updateMany(
  2.     <filter>,
  3.     <update>,
  4.     {
  5.         upsert: <boolean>,
  6.         writeConcern: <document>,
  7.         collation: <document>,
  8.         arrayFilters: [ <filterdocument1>, ... ],
  9.         hint:  <document|string>    // Available starting in MongoDB 4.2.1
  10.     }
  11. )
复制代码
单个替换

官方文档:db.collection.replaceOne() — MongoDB Manual
  1. db.collection.replaceOne(
  2.     <filter>,
  3.     <replacement>,
  4.     {
  5.         upsert: <boolean>,
  6.         writeConcern: <document>,
  7.         collation: <document>,
  8.         hint: <document|string>     // Available starting in 4.2.1
  9.     }
  10. )
复制代码
replaceOne 和 updateOne 操作的区别在于,updateOne 可以更新文档中部分键的值,而 replaceOne 的作用是直接将整个文档都替换掉,通常是建议使用 updateOne 而不是 replaceOne。
单个更新并返回

官方文档:db.collection.findOneAndUpdate() — MongoDB Manual
  1. db.collection.findOneAndUpdate(
  2.     <filter>,
  3.     <update document or aggregation pipeline>,  // Changed in MongoDB 4.2
  4.     {
  5.         projection: <document>,
  6.         sort: <document>,
  7.         maxTimeMS: <number>,
  8.         upsert: <boolean>,
  9.         returnDocument: <string>,
  10.         returnNewDocument: <boolean>,
  11.         collation: <document>,
  12.         arrayFilters: [ <filterdocument1>, ... ]
  13.     }
  14. )
复制代码
使用 findOneAndUpdate 而不是 updateOne 的最大目的莫过于使用 findOneAndUpdate 可以返回更新前后文档内容。
通过设置 returnNewDocument 的值为 true 可以返回更新后的文档,为 false 时可以返回更新前的文档。
单个替换并返回

官方文档:db.collection.findOneAndReplace() — MongoDB Manual
  1. db.collection.findOneAndReplace(
  2.     <filter>,
  3.     <replacement>,
  4.     {
  5.         projection: <document>,
  6.         sort: <document>,
  7.         maxTimeMS: <number>,
  8.         upsert: <boolean>,
  9.         returnDocument: <string>,
  10.         returnNewDocument: <boolean>,
  11.         collation: <document>
  12.     }
  13. )
复制代码
更新运算符

官方文档:Update Operators — MongoDB Manual
对于如 updateOne、updateMany、findOneAndUpdate 等更新操作,MongoDB 提供了原子的更新运算符支持只更新部分数据。
运算符支持以 { : { : ,... } } 的方式使用,并且可以同时使用多个运算符。
为避免出现歧义,不建议对同一个属性同时使用不同的运算符。
字段

数组

数组内层

位运算

$bit: 支持对整数值进行按位 AND、OR 或 XOR 更新,通过使用 { $bit: { : { :  } } } 完成更新。
批量写操作

官方文档:db.collection.bulkWrite() — MongoDB Manual
MongoDB 提供了 bulkwrite 命令支持批量执行命令,批处理时在一定程度上减少了网络交互的损耗。
  1. db.collection.bulkWrite(
  2.     [ <operation 1>, <operation 2>, ... ],
  3.     {
  4.          writeConcern: <document>,
  5.          ordered: <boolean>
  6.     }
  7. )
复制代码
支持的以下操作:
查询文档

单个查询

官方文档:db.collection.findOne() — MongoDB Manual
  1. db.collection.findOne(query, projection, options)
复制代码
第一个参数是查询条件,可以使用键值对的方式指定需要匹配的条件,多个键之间是 AND 的关系。
第二个参数用于仅返回指定的键,既可以节省网络传输的数据量,也可以减少客户端解码文档的时间和内存消耗。
第三个参数可以指定查询到可选项,这些选项会修改查询行为和返回结果的方式。更多查看 官方文档
批量查询

官方文档:db.collection.find() — MongoDB Manual
  1. db.collection.find(query, projection, options)
复制代码
数据库会使用游标返回 find 的执行结果。
对于游标,客户端可以限制结果的数量,跳过一些结果,按任意方向的任意键组合对结果进行排序等操作。更多查询 官方文档
下述是一些常用的游标方法:
在服务器端,游标会占用内存的资源。通常在以下情况会终止游标及进行随后的清理:
查询运算符

官方文档:Query and Projection Operators — MongoDB Manual
同样的,设置查询条件时,MongoDB 提供了查询运算符支持更多的查询方式。
比较运算符

逻辑运算符

对于普通的 $and 类型查询,我们总是希望尽可能用最少的参数来限定结果的范围。而 $or 类型查询则相反,如果第一个参数能够匹配尽可能多的文档,则其效率最高。
元素运算符

表达式运算符

数组运算符

投影运算符

投影运算符针对的是查询语句的第二个参数,即返回的结果。
特殊的 null 值

在 MongoDB 中,null 是一个比较特殊的值,它可以与自身匹配。也就是说了,通过 { field: null } 可以查询出 field 键为 null 的文档。
不过,更特殊的是,null 同样会匹配缺少这个键值的文档。也就是说,{ field: null } 可以查询出不包含 field 键的文档。
如果仅想匹配键值为 null 的文档,则需要检查该键的值是否为 null,并且通过 $exists 条件确认该键已存在,如 { field: { $eq: null, $exists: true } } 就是这样的查询条件组。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4