MongoDB查询操作符大全(附带实例)
MongoDB 提供了非常全面且强大的操作符和修饰符,通过这些操作符和修饰符可以实现对数据的各种操作。
MongoDB 的操作符与修饰符主要分为以下几类:
本节重点讲解 MongoDB 中的查询操作符。
$eq 操作符也可以进行数组操作,例如查询类别为历史类长篇小说的图书,即类别中同时含有 Novel 和 History 的图书。命令如下:
下面的代码示例通过 $exists 操作符判断 title 字段是否存在:
下面的代码示例先在集合的 title 字段上创建索引,然后使用 text 操作符指定 search 操作符的查询字符串:
下面的代码示例查询匹配的文档,这些文档的 results 数组中至少包含一个大于或等于 80 且小于 85 的元素:
以下操作使用 results 数组上的 $slice 投影运算符来返回数组及其前 3 个元素。如果数组的元素少于 3 个,则返回数组中的所有元素。
MongoDB 的操作符与修饰符主要分为以下几类:
- 查询操作符;
- 投影操作符;
- 更新操作符;
- 聚合管道操作符;
- 查询修饰符。
本节重点讲解 MongoDB 中的查询操作符。
MongoDB查询操作符
1) 比较查询操作符
比较查询操作符是查询中最常用的操作符。例如,使用 $eq 操作符查询书籍中书名为《三国演义》的图书信息,可使用如下命令:db.books.find({title:{$eq:'三国演义'}})该语句等同于如下语句:
db.books.find({title:'三国演义'})查询结果为:
reading> db.books.find({title:{$eq:'三国演义'}}) [ { "_id": ObjectId('658b45ef385404d7913a3df5'), "title": "三国演义", "genres": [ "Novel", "History" ], "author": [ "罗贯中" ] } ] reading> db.books.find({title:'三国演义'}) [ { "_id": ObjectId('658b45ef385404d7913a3df5'), "title": "三国演义", "genres": [ "Novel", "History" ], "author": [ "罗贯中" ] } ]
$eq 操作符也可以进行数组操作,例如查询类别为历史类长篇小说的图书,即类别中同时含有 Novel 和 History 的图书。命令如下:
db.books.find({genres:{$eq:['Novel','History']}})该语句等同于如下语句:
db.books.find({genres:['Novel','History']})查询结果为:
reading> db.books.find({genres:{$seq:['Novel', 'History']}}) [ { "_id": ObjectId('658b45ef385404d7913a3df5'), "title": "三国演义", "genres": [ "Novel", "History" ], "author": [ "罗贯中" ] } ] reading> db.books.find({genres:['Novel', 'History']}) [ { "_id": ObjectId('658b45ef385404d7913a3df5'), "title": "三国演义", "genres": [ "Novel", "History" ], "author": [ "罗贯中" ] } ]常用的比较查询操作符如下表所示:
名称 | 描述 |
---|---|
$eq | 等于,可省略 |
$gt | 大于 |
$gte | 大于或等于 |
$lt | 小于 |
$lte | 小于或等于 |
$ne | 不等于 |
$in | 在数组中 |
$nin | 不在数组中 |
2) 逻辑查询操作符
逻辑查询操作符的使用频率非常高。常用的逻辑查询操作符如下表所示:名称 | 描述 |
---|---|
$or | 或 |
$and | 且 |
$not | 取非 |
$nor | 同时取非 |
3) 元素查询操作符
常用的元素查询操作符如下表所示:名称 | 描述 |
---|---|
$exists | 是否存在指定的字段 |
$type | 查询指定类型的字段 |
下面的代码示例通过 $exists 操作符判断 title 字段是否存在:
db.books.find({ title: { $exists: true } })
4) 计算查询操作符
常用的计算查询操作符如下表所示:名称 | 描述 |
---|---|
$mod | 对字段的值执行模运算,并选择具有指定结果的文档 |
$regex | 选择值与指定正则表达式匹配的文档 |
$text | 文本搜索 |
$where | 匹配满足 JavaScript 表达式的文档 |
下面的代码示例先在集合的 title 字段上创建索引,然后使用 text 操作符指定 search 操作符的查询字符串:
db.books.createIndex({ title: "text" }) db.books.find({ $text: { $search: "三国" } })
5) 地理空间查询运算符
常用的地理空间查询运算符如下表所示:操作符类别 | 名称 | 描述 |
---|---|---|
选择器 | $geoWithin | 查询给定 GeoJSON 几何体内的几何体,支持 2d 和 2dsphere 索引 |
选择器 | $geoIntersects | 查询与 GeoJSON 几何体的交集,支持 2dsphere 索引 |
选择器 | $near | 返回点附近的地理空间对象。需要地理空间索引,支持 2d 和 2dsphere 索引。 |
选择器 | $nearSphere | 返回球面上的点附近的地理空间对象。需要地理空间索引,支持 2d 和 2dsphere 索引 |
几何标识符 | $geometry | 为地理空间查询运算符指定 GeoJSON 格式的几何体 |
几何标识符 | $minDistance | 在$near 和$nearSphere 查询中指定最小距离。仅支持 2dsphere 索引 |
几何标识符 | $maxDistance | 在$near 和$nearSphere 查询中指定最大距离。仅支持 2dsphere 索引 |
几何标识符 | $center | 在$geoWithin 查询中使用坐标对指定圆的经纬度和半径信息,支持 2d 索引 |
几何标识符 | $centerSphere | 在$geoWithin 查询中指定坐标对或 GeoJSON 对象格式的圆的信息。支持 2d 和 2dsphere 索引 |
几何标识符 | $box | 为$geoWithin 查询指定一个使用传统坐标对的矩形框。支持 2d 索引 |
几何标识符 | $polygon | 为$geoWithin 查询指定一个使用传统坐标对的多边形。支持 2d 索引 |
6) 查询操作符数组
常用的查询操作符数组如下表所示:名称 | 描述 |
---|---|
$all | 匹配包含查询中指定的所有元素的数组 |
$elemMatch | 选择数组字段中的元素与所有指定的 $elemMatch 条件匹配的文档 |
$size | 选择数组字段的 size 与指定 size 相同的文档 |
下面的代码示例查询匹配的文档,这些文档的 results 数组中至少包含一个大于或等于 80 且小于 85 的元素:
// 创建 scores 文档 { id: 1, results: [ 82, 85, 88 ] } { id: 2, results: [ 75, 88, 89 ] } // 通过$elemMatch 操作符查询文档 db.scores.find( { results: { $elemMatch: { $gte: 80, $lt: 85 } } } )
7) 投影操作符
常用的投影操作符如下表所示:名称 | 描述 |
---|---|
$ | 投影数组中与查询条件匹配的第一个元素 |
$elemMatch | 选择数组字段中的元素与所有指定的 $elemMatch 条件匹配的文档 |
$meta | 选择数组字段的 size 与指定 size 相同的文档 |
$slice | 限制从数组投影的元素数。支持跳过和限制切片 |
以下操作使用 results 数组上的 $slice 投影运算符来返回数组及其前 3 个元素。如果数组的元素少于 3 个,则返回数组中的所有元素。
db.scores.find( {}, { results: { $slice: 3 } } )