centos mongodb 第十七节课 常用的操作符
centos mongodb 第十七节课 常用的操作符
常用的操作符
MongoDB 提供了非常全面且强大的操作符和修饰符,通过这些操作符和修饰符可以实现对数据的各种操作。
MongoDB 的操作符与修饰符主要分为 4 类:
(1)查询和投影操作符、
(2)更新操作符、
(3)聚合管道操作符、
(4)查询修饰符。
(1)查询和投影操作符
1. 比较查询操作符
比较查询操作符是查询中最常用的操作符。在前面的讲解与示例中已多次用到相关的操作符,尤其是 find 查询中的相等判断。
例如,使用 $eq 操作符查询书籍中书名为《三国演义》的图书信息,可使用如下命令:
db.books.find({ title: { $eq: '三国演义' } })
该语句等同于如下语句:
db.books.find({ title: '三国演义' })
$eq 操作符也可以进行数组操作,例如查询类别为历史长篇小说的图书,即类别中同时含有 Novel 和 History 的图书。命令如下:
db.books.find({ genres: { $eq: ['Novel', 'History'] } })
该语句等同于如下语句:
db.books.find({ genres: ['Novel', 'History'] })
比较查询操作符
$eq 等于,可省略
$gt 大于
$gte 大于或等于
$lt 小于
$lte 小于或等于
$ne 不等于
$in 在数组中
$nin 不在数组中
逻辑查询操作符
$or 或
$and 且
$not 取非
$nor 同时取非
查询数组操作符
$all 匹配包含查询中指定的所有元素的数组
$elemMatch 选择数组字段中的元素与所有指定的 $elemMatch 条件匹配的文档
$size 选择数组字段的 size 与指定 size 相同的文档
下面的代码示例查询匹配的文档,这些文档的 results 数组中至少包含一个大于或等于 80 且小于 85 的元素:
{ _id: 1, results: [ 82, 85, 88 ] }
{ _id: 2, results: [ 75, 88, 89 ] }
// 通过 $elemMatch 操作符查询文档
db.scores.find({
results: { $elemMatch: { $gte: 80, $lt: 85 } }
})
投影操作符
$ 投影数组中与查询条件匹配的第一个元素
$elemMatch 选择数组字段中的元素与所有指定的 $elemMatch 条件匹配的文档
$meta 选择数组字段的 size 与指定 size 相同的文档
$slice 限制从数组投影的元素数。支持跳过和限制切片
以下操作使用 results 数组上的 $slice 投影运算符来返回数组及其前 3 个元素。如果数组的元素少于 3 个,则返回数组中的所有元素。
下面的代码示例通过在 results 数组上使用 $slice 投影运算符来返回数组的前 3 个元素,如果数组的元素少于 3 个,则返回数组中的所有元素:
db.scores.find({}, { results: { $slice: 3 } })
(2)更新操作符
根据操作对象划分,更新操作符分为字段更新操作符、数组更新操作符、数组更新修饰符、位更新操作符和隔离更新操作符。
1. 字段更新操作符
$inc 增加字段值
$mul 将字段值乘以给定值
$rename 重命名字段
$setOnInsert 如果更新时,文档记录不存在,则使用该操作符设置字段的值。对已存在文档的更新操作无影响
$set 设置字段的值
$unset 从文档中删除指定的字段
$min 更新字段值大于给定值的字段
$max 更新字段值小于给定值的字段
$currentDate 设置字段值为当前时间,格式为 Date 或 Timestamp
下面的代码示例通过使用 $rename 运算符将 title 字段重命名为 newtitle 字段:
db.books.updateMany({ $rename: { "title": "newtitle" } })
2. 数组更新操作符
$ 充当占位符以更新与查询条件匹配的第一个元素
$addToSet 向集合中添加不存在的元素
$pop 删除数组的第一个或最后一个元素
$pullAll 从数组中删除所有匹配的元素
$pull 删除匹配指定查询语句的所有数组元素
$push 向数组中增加一个元素
下面的代码示例通过使用 $addToSet 运算符为 results 字段添加新数据项:
db.scores.updateOne( { _id: 1 }, { $addToSet: { results: "100" } } )
3. 数组更新修饰符
$each 修饰 $push 和 $addToSet 操作符,为数组更新追加多个项
$slice 修饰 $push 操作符,限制更新的数组 size
$sort 修饰 $push 操作符,对数组中存储的元素重新排序
$position 修饰 $push 操作符,在数组指定的位置增加元素
下面的代码示例通过使用 $sort 运算符为 results 字段重新进行排序:
db.scores.updateOne( { _id: 1 }, { $push: { results: { $sort: 1 } } } )
4. 位更新操作符
$bit 对整数值执行逐位 “与”“或” 和 “异或” 更新
5. 隔离更新操作符
$isolated 修改写入操作的行为以增加操作的隔离度
(3)聚合管道操作符
在复杂查询中,聚合管道查询的应用较多。常用的聚合管道操作符如表 5.18 所示。
$project 重塑流中的每个文档,例如通过添加新字段或修改或删除现有字段。对于每个输入文档,输出一个文档
$match 过滤文档流,只允许匹配的文档未经修改地传递到下一个管道阶段。$match 使用标准的 MongoDB 查询。对于每个输入文档,输出一个文档(匹配)或零个文档(不匹配)
$redact 通过基于存储在文档本身中的信息限制每个文档的内容来重塑流中的每个文档。包含 $project 和 $match 的功能。可用于实现字段级编校。对于每个输入文档,输出一个或零个文档
$limit 将未修改的前 n 个文档传递到管道,其中 n 是指定的限制。对于每个输入文档,输出一个文档(前 n 个文档)或零个文档(在前 n 个文件之后)
$skip 跳过前 n 个文档,其中 n 是指定的跳过编号,并将未修改的其余文档传递到管道。对于每个输入文档,输出一个文档(对于前 n 个每个)或一个文档(如果在前 n 个文件之后)
$unwind 从输入文档中解构一个数组字段,为每个元素输出一个文档。每个输出文档都用一个元素值替换数组。对于每个输入文档,输出 n 个文档,其中 n 是数组元素的数量,对于空数组可以为
$group 根据指定的标识符表达式对输入文档进行分组,并将累加器表达式(如果指定)应用于每个组。使用所有输入文档,并为每个不同的组输出一个文档。输出文档仅包含标识符字段,如果指定,还包含累积字段
$sort 按指定的排序键重新排序文档流。只有订单发生变化,这些文档保持不变。对于每个输入文档,输出一个文档
$geoNear 根据与地理空间点的接近程度返回有序的文档流。结合了地理空间数据的 $match、$sort 和 $limit 功能。输出文档包括附加的距离字段,并且可以包括位置标识符字段
$out 将聚合管道的结果文档写入集合。要使用 $out 阶段,它必须是管道中的最后一个阶段
下面的代码示例通过使用 $match 运算符匹配 author 字段值的全部文档:
db.books.aggregate([ { $match: { author: "罗贯中" } } ]);
(4)查询修饰符
在查询时,除操作符外,还有一些修饰符,用来指定一些限制条件或格式。常用的查询修饰符如表 5.19 所示。
$comment 向查询中添加注释,以标识数据库探查器输出中的查询
$explain 强制 MongoDB 报告查询执行计划
$hint 强制 MongoDB 使用特定索引
$maxScan 限制扫描的文档数量
$maxTimeMS 指定处理查询的操作的累积时间限制(以毫秒为单位)
$max 指定要在光标中使用的索引的上限
$min 指定要在查询中使用的索引的下限
$orderby 返回一个光标,其中包含根据排序规范排序的文档
$returnKey 强制光标仅返回索引中包含的字段
$showDiskLoc 修改返回的文档,以包含对每个文档在磁盘上位置的引用
$snapshot 强制查询时在 _id 字段上使用索引
$query 封装查询文档
$natural 特定的排序规则,即使用文档在磁盘上的默认排序
下面的代码示例通过使用 $comment 运算符为查询结果添加评论信息:
db.books.aggregate([ { $match: { author: "罗贯中" }, $comment: "Find all authors." } ]);
f

浙公网安备 33010602011771号