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 } } )
ICP备案:
公安联网备案: