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: "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 常用的操作符以及简要的说明和示例:

查询操作符

  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 官方文档。

相关推荐
ningqw2 小时前
SpringBoot 常用跨域处理方案
java·后端·springboot
你的人类朋友2 小时前
vi编辑器命令常用操作整理(持续更新)
后端
胡gh2 小时前
简单又复杂,难道只能说一个有箭头一个没箭头?这种问题该怎么回答?
javascript·后端·面试
一只叫煤球的猫3 小时前
看到同事设计的表结构我人麻了!聊聊怎么更好去设计数据库表
后端·mysql·面试
uzong3 小时前
技术人如何对客做好沟通(上篇)
后端
颜如玉4 小时前
Redis scan高位进位加法机制浅析
redis·后端·开源
Moment4 小时前
毕业一年了,分享一下我的四个开源项目!😊😊😊
前端·后端·开源
why技术5 小时前
在我眼里,这就是天才般的算法!
后端·面试
绝无仅有5 小时前
Jenkins+docker 微服务实现自动化部署安装和部署过程
后端·面试·github
程序视点5 小时前
Escrcpy 3.0投屏控制软件使用教程:无线/有线连接+虚拟显示功能详解
前端·后端