我有一个具有以下结构的集合:
{
{
node: 'ST20'
Ds:{
699:{
TotCM: 300
Docsis20: 200
Docsis30: 100
}
705:{
TotCM: 250
Docsis20: 150
Docsis30: 100
}
}
}
{
node: 'ST21'
Ds:{
651:{
TotCM: 200
Docsis20: 100
Docsis30: 100
}
699:{
TotCM: 100
Docsis20: 0
Docsis30: 100
}
}
}
}如您所见,我有一个表示节点的文档。每个节点,都有不同的信道。我的目标是看看我在每个频道里有多少辆出租车。从前期来看,我不知道我在每个节点中有哪些通道。所以我想要这样的东西:
{ node: 'ST20', Ds: 699, TotCM: 300, Docsis20: 200, Docsis30:100 }
{ node: 'ST20', Ds: 705, TotCM: 250, Docsis20: 150, Docsis30:100 }
{ node: 'ST21', Ds: 651, TotCM: 200, Docsis20: 100, Docsis30:100 }
{ node: 'ST21', Ds: 699, TotCM: 100, Docsis20: 0, Docsis30:100 }我尝试了以下查询:
db.statsNodos.aggregate(
{ $project: {_id:0,Ds:1,node:1}},
{ $unwind: "$Ds"}
).pretty()但我拿到了原始文件。而且,如您所见,它们是嵌套的文档,而不是一个文档数组。也许我不需要使用$unwind,而且还有另一种方法可以得到这个结果。你能不能告诉我?
发布于 2017-09-19 12:42:50
给定您的示例文档结构:
{ node: 'ST21',
Ds: {
"651":{ TotCM: 200, Docsis20: 100, Docsis30: 100 },
"699":{ TotCM: 100, Docsis20: 0, Docsis30: 100 }
}
}您可以使用算子$objectToArray将您的字段channels名称转换为值。例如:
{"$project": {
"_id": 0,
"node": 1,
"tmp": { "$objectToArray": "$Ds" }
}
},
{"$unwind": "$tmp" },
{"$project": {
"node": 1,
"Ds": "$tmp.k",
"TotCM": "$tmp.v.TotCM",
"Docsis20": "$tmp.v.Docsis20",
"Docsis30": "$tmp.v.Docsis30"
}
}为了更容易地查询,我还建议重新考虑您的MongoDB数据模式。
https://stackoverflow.com/questions/46286550
复制相似问题