查询条件
以单层文档为条件查询时,直接使用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 官方文档。