MongoDB:从两个不同的表中检索不同的计数

时间:2017-01-24 14:49:52

标签: mongodb mongodb-query

我继承了一个包含MongoDB服务器中大量数据的项目。我正在为它写一些查询,并遇到了一个相当烦人的问题。我需要找到我们称之为ID的唯一值的数量。问题是,它们可能出现在两个不同的点上,具体取决于这些数据的来源。

例如,表格看起来像这样:

{ 
  foo: {
     ID: "ABC123"
  },
  bar: {
     ID: undefined
  }
}

{ 
  foo: {
     ID: undefined
  },
  bar: {
     ID: "ABC123"
  }
}

{ 
  foo: {
     ID: "ABC123"
  },
  bar: {
     ID: "ABC123"
  }
}

不幸的是,此时我无法对数据进行重新建模。我对MongoDB的了解相当有限。我想知道是否有一种方法可以使用聚合将它们连接在一起,所以我将一组所有ID都放到一个Document中,这样它们都是唯一的。对一组或另一组进行分组是相当微不足道的,但对两者进行分组会给我重复。

2 个答案:

答案 0 :(得分:5)

您可以使用$project然后$group,然后使用$addToSet

db.c.aggregate([
{
    $project : {
        _id : 0,
        IDS : ["$foo.ID", "$bar.ID"]
    }
},
{
    $unwind : "$IDS"
},
{
    $group : {
        _id : 1,
        distinctIds : {
            $addToSet : "$IDS"
        }
    }
}
])

答案 1 :(得分:2)

您可以尝试$group将每个ID'sbar doc中的foo放入一个数组中,然后通过$setUnion运行它们以区分以前分组ID's

db.collection.aggregate({
    $group: {
        "_id": null,
        "ID": {
            $addToSet: {
                "foo_id": "$foo.ID",
                "bar_id": "$bar.ID"
            }
        }
    }
}, {
    $project: {
        "ID": {
            $setUnion: ["$ID.foo_id", "$ID.bar_id"]
        },
        _id: 0
    }
})