我继承了一个包含MongoDB服务器中大量数据的项目。我正在为它写一些查询,并遇到了一个相当烦人的问题。我需要找到我们称之为ID
的唯一值的数量。问题是,它们可能出现在两个不同的点上,具体取决于这些数据的来源。
例如,表格看起来像这样:
{
foo: {
ID: "ABC123"
},
bar: {
ID: undefined
}
}
或
{
foo: {
ID: undefined
},
bar: {
ID: "ABC123"
}
}
或
{
foo: {
ID: "ABC123"
},
bar: {
ID: "ABC123"
}
}
不幸的是,此时我无法对数据进行重新建模。我对MongoDB的了解相当有限。我想知道是否有一种方法可以使用聚合将它们连接在一起,所以我将一组所有ID都放到一个Document中,这样它们都是唯一的。对一组或另一组进行分组是相当微不足道的,但对两者进行分组会给我重复。
答案 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's
和bar
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
}
})