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

相关推荐
hlsd#7 分钟前
go mod 依赖管理
开发语言·后端·golang
陈大爷(有低保)11 分钟前
三层架构和MVC以及它们的融合
后端·mvc
亦世凡华、12 分钟前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
河西石头12 分钟前
一步一步从asp.net core mvc中访问asp.net core WebApi
后端·asp.net·mvc·.net core访问api·httpclient的使用
2401_8574396924 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66625 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
阿华的代码王国1 小时前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话
小码编匠1 小时前
领域驱动设计(DDD)要点及C#示例
后端·c#·领域驱动设计
德育处主任Pro2 小时前
『Django』APIView基于类的用法
后端·python·django
哎呦没4 小时前
SpringBoot框架下的资产管理自动化
java·spring boot·后端