查询条件
以单层文档为条件查询时,直接使用key和对应的value查询,同时可以配合操作符。
以多层嵌套文档为条件查询时,此时嵌套为另外一个文档:
在 MongoDB 中筛选多层级文档可以使用点符号 .
来访问嵌套字段。例如,如果有一个多层级文档结构如下:
json
{
"_id": 1,
"name": "John Doe",
"address": {
"street": "123 Main St",
"city": "New York",
"zipcode": "10001"
}
}
要筛选其中的某个嵌套字段,可以使用点符号指定路径,例如:
javascript
db.collection.find({"address.city": "New York"})
上面的查询会返回具有城市为 "New York" 的地址的文档。
注意:MongoDB 中的查询操作 db.collection.find({"address.": {"city":"New York"}}) 是无效的
以多层嵌套文档为条件查询时,此时嵌套为另外一个数组时:
要查询字段是数组里嵌套文档的情况,可以使用 MongoDB 的 $elemMatch
运算符来进行查询。假设有一个集合中包含一个名为 contacts
的数组字段,数组中的元素是包含 name
和 email
字段的文档。现在要查询数组中 email
字段为特定值的文档,可以使用以下方式:
javascript
db.collection.find({ contacts: { $elemMatch: { email: "example@email.com" } } })
这样的查询语句会返回数组 contacts
中包含有 email
字段为 "example@email.com" 的文档。注意,$elemMatch
运算符用于匹配数组中至少有一个元素满足指定条件的情况。
如果要进一步筛选数组中满足多个条件的文档,可以在 $elemMatch
运算符中添加多个条件,例如:
javascript
db.collection.find({
contacts: {
$elemMatch: {
email: "example@email.com",
name: "John Doe"
}
}
})
这样的查询会返回数组 contacts
中同时满足 email
为 "example@email.com" 和 name
为 "John Doe" 的文档。
常用操作符
MongoDB 提供了丰富的操作符,涵盖了查询、更新、删除等操作。以下是 MongoDB 常用的操作符以及简要的说明和示例:
查询操作符
-
比较操作符
$eq
: 等于$ne
: 不等于$gt
: 大于$lt
: 小于$gte
: 大于等于$lte
: 小于等于
jsondb.collection.find({ age: { $gt: 18 } })
-
逻辑操作符
$and
: 与$or
: 或$not
: 非
jsondb.collection.find({ $or: [{ age: 20 }, { name: "Alice" }] })
-
元素操作符
$exists
: 判断字段是否存在$type
: 判断字段类型
jsondb.collection.find({ field: { $exists: true } })
-
数组操作符
$elemMatch
: 匹配数组中满足所有条件的元素$in
: 匹配数组中满足任意条件的元素$size
: 匹配数组长度
jsondb.collection.find({ tags: { $elemMatch: { $eq: "MongoDB" } } })
-
正则表达式操作符
$regex
: 匹配正则表达式
jsondb.collection.find({ name: { $regex: "^A" } })
更新操作符
-
修改器操作符
$set
: 设置字段值$unset
: 删除字段$inc
: 字段增加指定值
jsondb.collection.update({ name: "Alice" }, { $set: { age: 25 } })
-
数组修改器操作符
$push
: 添加元素到数组$pull
: 从数组中删除元素$addToSet
: 添加唯一元素到数组
jsondb.collection.update({ _id: ObjectId("...") }, { $push: { tags: "MongoDB" } })
聚合操作符
- 聚合管道内操作符
语法:{[表达式]:$[feild]}
, 举例:
javascript
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]);
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]);
- 算术操作符:
- $sum 计算总和。
- $avg 计算平均值
- $min 获取集合中所有文档对应值得最小值。
- $max 获取集合中所有文档对应值得最大值。
$stdDevPop
: 计算数组中数值的总体标准差。$stdDevSamp
: 计算数组中数值的样本标准差。
- 数组操作符:
- $push 将值加入一个数组中,不会判断是否有重复的值。
- $addToSet 将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入。
- $first 根据资源文档的排序获取第一个文档数据。
- $last 根据资源文档的排序获取最后一个文档数据
- 类型转换操作符:
$toInt
: 将值转换为整数。$toDouble
: 将值转换为双精度浮点数。$toBool
: 将值转换为布尔类型。
- 文本搜索操作符:
$text
: 在文本字段上执行全文搜索。
- 日期操作符:
$year
: 提取日期的年份。$month
: 提取日期的月份。$dayOfMonth
: 提取日期的日份。$hour
: 提取时间的小时。$minute
: 提取时间的分钟。$second
: 提取时间的秒数。
- 聚合管道
以下是 MongoDB 中所有的聚合表达式及其简要说明:
- $accumulator:定义用户自定义累加器。
- $addFields:添加新字段到文档。
- $bucket:将文档按照指定条件分桶。
- $bucketAuto:自动根据指定桶大小将文档分桶。
- $collStats:返回集合的统计信息。
- $count:计算文档数量。
- $currentOp:显示当前正在执行的操作。
- $facet:按多个不同的管道处理同一个输入文档集合。
- $geoNear:返回地理空间索引中距离给定点最近的文档。
- $graphLookup:使用递归查找关联文档。
- $group:按指定字段分组聚合。
- $indexStats:返回集合索引的统计信息。
- $limit:限制返回文档数量。
- $listLocalSessions:列出当前会话。
- $listSessions:列出所有会话。
- $lookup:在两个集合之间执行左外连接。
- $match:筛选文档。
- $merge:合并管道结果到集合。
- $out:将聚合结果输出到新的集合。
- $planCacheStats:返回查询计划缓存的统计信息。
- $project:投影出指定字段。
- $redact:根据权限控制规则将文档裁剪为子集。
- $replaceRoot:替换文档根。
- $replaceWith:替换文档为指定文档。
- $sample:随机获取样本文档。
- $set:设置字段值。
- $setWindowFields:为每个窗口文档设置新字段。
- $skip:跳过指定数量的文档。
- $sort:对文档进行排序。
- $sortByCount:按字段值计数并排序。
- $unionWith:将来自不同集合的文档合并到结果集。
- $unset:删除文档的字段。
- $unwind:展开数组字段。
这些聚合表达式是 MongoDB 中常用的,每个表达式都有不同的作用,可以根据实际需求进行选择和使用。详细的聚合表达式和用法可以参考 MongoDB 官方文档。