MongoDB操作符和管道整理

查询条件

以单层文档为条件查询时,直接使用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 的数组字段,数组中的元素是包含 nameemail 字段的文档。现在要查询数组中 email 字段为特定值的文档,可以使用以下方式:

javascript 复制代码
db.collection.find({ contacts: { $elemMatch: { email: "[email protected]" } } })

这样的查询语句会返回数组 contacts 中包含有 email 字段为 "[email protected]" 的文档。注意,$elemMatch 运算符用于匹配数组中至少有一个元素满足指定条件的情况。

如果要进一步筛选数组中满足多个条件的文档,可以在 $elemMatch 运算符中添加多个条件,例如:

javascript 复制代码
db.collection.find({
  contacts: {
    $elemMatch: {
      email: "[email protected]",
      name: "John Doe"
    }
  }
})

这样的查询会返回数组 contacts 中同时满足 email 为 "[email protected]" 和 name 为 "John Doe" 的文档。

常用操作符

MongoDB 提供了丰富的操作符,涵盖了查询、更新、删除等操作。以下是 MongoDB 常用的操作符以及简要的说明和示例:

查询操作符

  1. 比较操作符

    • $eq: 等于
    • $ne: 不等于
    • $gt: 大于
    • $lt: 小于
    • $gte: 大于等于
    • $lte: 小于等于
    json 复制代码
    db.collection.find({ age: { $gt: 18 } })
  2. 逻辑操作符

    • $and: 与
    • $or: 或
    • $not: 非
    json 复制代码
    db.collection.find({ $or: [{ age: 20 }, { name: "Alice" }] })
  3. 元素操作符

    • $exists: 判断字段是否存在
    • $type: 判断字段类型
    json 复制代码
    db.collection.find({ field: { $exists: true } })
  4. 数组操作符

    • $elemMatch: 匹配数组中满足所有条件的元素
    • $in: 匹配数组中满足任意条件的元素
    • $size: 匹配数组长度
    json 复制代码
    db.collection.find({ tags: { $elemMatch: { $eq: "MongoDB" } } })
  5. 正则表达式操作符

    • $regex: 匹配正则表达式
    json 复制代码
    db.collection.find({ name: { $regex: "^A" } })

更新操作符

  1. 修改器操作符

    • $set: 设置字段值
    • $unset: 删除字段
    • $inc: 字段增加指定值
    json 复制代码
    db.collection.update({ name: "Alice" }, { $set: { age: 25 } })
  2. 数组修改器操作符

    • $push: 添加元素到数组
    • $pull: 从数组中删除元素
    • $addToSet: 添加唯一元素到数组
    json 复制代码
    db.collection.update({ _id: ObjectId("...") }, { $push: { tags: "MongoDB" } })

聚合操作符

  1. 聚合管道内操作符

语法:{[表达式]:$[feild]}, 举例:

javascript 复制代码
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]);
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]);
  1. 算术操作符:
  • $sum 计算总和。
  • $avg 计算平均值
  • $min 获取集合中所有文档对应值得最小值。
  • $max 获取集合中所有文档对应值得最大值。
  • $stdDevPop: 计算数组中数值的总体标准差。
  • $stdDevSamp: 计算数组中数值的样本标准差。
  1. 数组操作符:
  • $push 将值加入一个数组中,不会判断是否有重复的值。
  • $addToSet 将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入。
  • $first 根据资源文档的排序获取第一个文档数据。
  • $last 根据资源文档的排序获取最后一个文档数据
  1. 类型转换操作符:
  • $toInt: 将值转换为整数。
  • $toDouble: 将值转换为双精度浮点数。
  • $toBool: 将值转换为布尔类型。
  1. 文本搜索操作符:
  • $text: 在文本字段上执行全文搜索。
  1. 日期操作符:
  • $year: 提取日期的年份。
  • $month: 提取日期的月份。
  • $dayOfMonth: 提取日期的日份。
  • $hour: 提取时间的小时。
  • $minute: 提取时间的分钟。
  • $second: 提取时间的秒数。
  1. 聚合管道

以下是 MongoDB 中所有的聚合表达式及其简要说明:

  1. $accumulator:定义用户自定义累加器。
  2. $addFields:添加新字段到文档。
  3. $bucket:将文档按照指定条件分桶。
  4. $bucketAuto:自动根据指定桶大小将文档分桶。
  5. $collStats:返回集合的统计信息。
  6. $count:计算文档数量。
  7. $currentOp:显示当前正在执行的操作。
  8. $facet:按多个不同的管道处理同一个输入文档集合。
  9. $geoNear:返回地理空间索引中距离给定点最近的文档。
  10. $graphLookup:使用递归查找关联文档。
  11. $group:按指定字段分组聚合。
  12. $indexStats:返回集合索引的统计信息。
  13. $limit:限制返回文档数量。
  14. $listLocalSessions:列出当前会话。
  15. $listSessions:列出所有会话。
  16. $lookup:在两个集合之间执行左外连接。
  17. $match:筛选文档。
  18. $merge:合并管道结果到集合。
  19. $out:将聚合结果输出到新的集合。
  20. $planCacheStats:返回查询计划缓存的统计信息。
  21. $project:投影出指定字段。
  22. $redact:根据权限控制规则将文档裁剪为子集。
  23. $replaceRoot:替换文档根。
  24. $replaceWith:替换文档为指定文档。
  25. $sample:随机获取样本文档。
  26. $set:设置字段值。
  27. $setWindowFields:为每个窗口文档设置新字段。
  28. $skip:跳过指定数量的文档。
  29. $sort:对文档进行排序。
  30. $sortByCount:按字段值计数并排序。
  31. $unionWith:将来自不同集合的文档合并到结果集。
  32. $unset:删除文档的字段。
  33. $unwind:展开数组字段。

这些聚合表达式是 MongoDB 中常用的,每个表达式都有不同的作用,可以根据实际需求进行选择和使用。详细的聚合表达式和用法可以参考 MongoDB 官方文档。

相关推荐
〆、风神11 分钟前
Spring Boot 自定义 Redis Starter 开发指南(附动态 TTL 实现)
spring boot·redis·后端
Asthenia041218 分钟前
HashMap 扩容机制与 Rehash 细节分析
后端
DataFunTalk19 分钟前
不是劝退,但“BI”基础不佳就先“别搞”ChatBI了!
前端·后端
星星电灯猴20 分钟前
flutter项目 发布Google Play
后端
用户97044387811631 分钟前
按图搜索1688商品(拍立淘)API 返回值说明
javascript·后端·算法
Fly_hao.belief32 分钟前
Spring Boot 框架注解:@ConfigurationProperties
java·spring boot·后端
代码吐槽菌35 分钟前
基于SpringBoot的水产养殖系统【附源码】
java·数据库·spring boot·后端·毕业设计
尽一份心出一份力36 分钟前
等不是办法,干才有希望,快速跑通graphRag
后端·机器学习·开源
LaoZhangAI36 分钟前
【2025最新】Dify接入GPT-4o完全指南:8种稳定高效使用方法
前端·后端
掉鱼的猫42 分钟前
无耳 Solon AI v3.1.2 发布(兼容 Java 8 ~ 24),支持 SpringBoot2,jFinal,Vert.X 等第三方框架
java·后端