假设我具有以下结构:
"KnownName" : {
"unknownName1" : {
"id" : "unknownName1",
"value" : "5"
},
"unknownName2" : {
"id" : "unknownName2",
"value" : "5"
},
"unknownName3" : {
"id" : "unknownName3",
"value" : "5"
},
"unknownName4" : {
"id" : "unknownName4",
"value" : "5"
},
"unknownName5" : {
"id" : "unknownName5_v2",
"value" : "5"
},
"unknownName6" : {
"id" : "unknownName6",
"value" : "5"
}
... many more documents as above in various ways
我想像这样计数所有这些:
unknownName1 : 24
unknownName2 : 27
unknownName3 : 10
....
unknownName37 : 12
我确实知道我在'KnownName'节点上的结构,但是在该节点内,我可以有几个不同的标签(此处为unknownName 1至6),但是可以有更多或更少的标签,并且根据文档的不同也可以有所不同。通常,数组中的id与数组标签具有相同的名称,但不是给定的(如unknownName5)。
我一直在寻找一种方法来获取所有这些“ unknownNames”的数量,但这似乎比预期的更具挑战性。
有关如何实现(最好使用聚合框架)的任何建议
如果有一种简便的方法可以在“ KnownName”树中获取所有(深)子级标记为“ id”的子级,而无需知道未知的父级名称,那么它也对我有用。我知道mongo中没有通配符之类的东西,但是我正在寻找替代KnownName。*。id
的东西。答案 0 :(得分:1)
由于密钥未知,因此需要以$objectToArray开始。然后,您将获得可以使用$group处理以获取计数的键和值的数组。您还可以使用$replaceRoot和$arrayToObject来获取根对象中的动态键
db.col.aggregate([
{
$addFields: {
unknown: { $objectToArray: "$KnownName" }
}
},
{
$unwind: "$unknown"
},
{
$group: {
_id: "$unknown.k",
count: { $sum: 1 }
}
},
{
$sort: { _id: 1 }
},
{
$group: {
_id: null,
data: { $push: { k: "$_id", v: "$count" } }
}
},
{
$replaceRoot: {
newRoot: {
$arrayToObject: "$data"
}
}
}
])