首页 > 解决方案 > MongoDB聚合,如果存在,则查找非唯一的双字段

问题描述

我有这样的 MongoDB 集合:

{ "parentId": "5d304431fdfd02eacf7d5dce", "name": "test" }
{ "parentId": "5d304431fdfd02eacf7d5dce", "name": "test" }
{ "parentId": "5d304431fdfd02eacf7d5dce", "name": "test" }
{ "name": "test"}
{ "name": "test"}
{ "parentId": "5d02033efdfd02580e04570e", "name": "test4" }
{ "parentId": "5d02033efdfd02580e04570e", "name": "test5" }
{ "parentId": "5d02033efdfd02580e04570e", "name": "test5" }

我需要找到所有非唯一的 2 个字段值:“parentId”和“name”。但主要问题 - 有些文档没有所需字段之一(示例)。

我被困在查询中:

db.default.aggregate([
  {
    "$group": {
      "_id": {
        "parentId": "$parent",
        "name": "$name"
      },
      "uniqueIds": {
        "$addToSet": "$_id"
      },
      "count": {
        "$sum": 1
      }
    }
  },
  {
    "$match": {
      "count": {
        "$gt": 1
      }
    }
  }
])

所以,我想完成:

{ "parentId": "5d304431fdfd02eacf7d5dce", "name": "test", count: "3" }
{ "parentId": "5d02033efdfd02580e04570e", "name": "test5", count: "2" }

标签: mongodbmongodb-queryaggregation-framework

解决方案


以下查询可以获得预期的输出:

db.default.aggregate([
    {
        $match:{
            "parentId":{
                $exists: true
            },
            "name":{
                $exists: true
            }
        }
    },
    {
        $group:{
            "_id":{
                "parentId": "$parentId",
                "name":"$name"
            },
            "parentId":{
                $first: "$parentId"
            },
            "name":{
                $first: "$name"
            },
            "count":{
                $sum: 1
            }
        }
    },
    {
        $match:{
            "count":{
                $gt:1
            }
        }
    },
    {
        $project:{
            "_id":0
        }   
    }
]).pretty()

输出:

{ "parentId" : "5d02033efdfd02580e04570e", "name" : "test5", "count" : 2 }
{ "parentId" : "5d304431fdfd02eacf7d5dce", "name" : "test", "count" : 3 }

推荐阅读