首页 > 解决方案 > Mongo 聚合组和匹配

问题描述

是否可以按 uuid 分组以查找最大版本然后过滤标志?我希望先找到版本 3,然后查看它是否有标记“Y”。似乎在分组之前应用了过滤器,因此我得到的是版本 1。

 {"uuid" : 1, "version" : 1, "name" : "Bob", "flag" : "Y"}
 {"uuid" : 1, "version" : 2, "name" : "Bob", "flag" : "N"}
 {"uuid" : 1, "version" : 3, "name" : "Bob", "flag" : "N"}

提前致谢 !!

标签: mongodbmongodb-query

解决方案


这是一种方式,如果我明白你的想法:

db.collection.aggregate({
  $group: {
    _id: "$uuid",
    docs: {
      $push: "$$ROOT"
    },
    "max_version": {
      "$max": "$version"
    }
  }
},
{
  $addFields: {
    docs: {
      "$filter": {
        "input": "$docs",
        "as": "d",
        "cond": {
          $eq: [
            "$$d.version",
            "$max_version"
          ],
          $eq: [
            "$$d.flag",
            "Y"
          ]
        }
      }
    }
  }
})

主意

  • $group by uuid 并提取组中的最大值version
  • 过滤文档数组中的 amax_versionflag

推荐阅读