首页 > 编程笔记 > MongoDB 阅读:11

MongoDB查询操作符大全(附带实例)

MongoDB 提供了非常全面且强大的操作符和修饰符,通过这些操作符和修饰符可以实现对数据的各种操作。

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 } } )

相关文章