&引用;“结构化”;MongoDB中的分组查询

&引用;“结构化”;MongoDB中的分组查询,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我收集了以下物品: [{ "_id": 1, "manufactureId": 1, "itemTypeId": "Type1" }, { "_id": 2, "manufactureId": 1, "itemTypeId": "Type2" }, { "_id": 3, "manufactureId": 2, "itemTypeId": "Type1" }] 我想创建一个查询,返回每个制造商在以下结构(或类似结构)中拥有

我收集了以下物品:

[{
    "_id": 1,
    "manufactureId": 1,
    "itemTypeId": "Type1"
},
{
    "_id": 2,
    "manufactureId": 1,
    "itemTypeId": "Type2"
},
{
    "_id": 3,
    "manufactureId": 2,
    "itemTypeId": "Type1"
}]
我想创建一个查询,返回每个制造商在以下结构(或类似结构)中拥有的每种商品类型的商品数量:

我曾尝试使用聚合框架,但我不知道是否有办法使用它创建“结构化”groupby查询。 通过对这个简单的聚合查询结果进行后处理,我可以很容易地获得所需的结果:

db.items.aggregate([{$group:{_id:{itemTypeId:"$itemTypeId",manufactureId:"$manufactureId"},count:{$sum:1}}}])
但如果可能的话,我不希望对结果进行后期处理。

数据保留数据 我更愿意使用这个查询,我相信它将为您提供最接近您想要的数据结构,而无需进行后期处理

查询
db.items.aggregate(
{
$group:
{
_身份证:
{
itemTypeId:“$itemTypeId”,
manufactureId:“$manufactureId”
},
计数:
{
$sum:1
}
},
},
{
$group:
{
_id:“$\u id.manufactureId”,
项目计数:
{
“$push”:
{
itemTypeId:“$\u id.itemTypeId”,
计数:“$count”
}
}
}
})
输出
{
“_id”:1,
“项目计数”:[
{
“itemTypeId”:“Type1”,
“计数”:1
},
{
“itemTypeId”:“Type2”,
“计数”:1
}
]
},
{
“_id”:2,
“项目计数”:[
{
“itemTypeId”:“Type1”,
“计数”:1
}
]
}
转换为对象字段的数据 这实际上是一种我一般不会建议的方法。在应用程序中更难管理,因为不同对象之间的字段名不一致,并且您无法事先知道需要哪些对象字段。如果您使用强类型语言,这将是一个关键点。自动数据绑定到域对象将变得不可能

无论如何,获得您想要的确切数据结构的唯一方法是应用后处理

查询
db.items.aggregate(
{
$group:
{
_身份证:
{
itemTypeId:“$itemTypeId”,
manufactureId:“$manufactureId”
},
计数:
{
$sum:1
}
},
},
{
$group:
{
_id:“$\u id.manufactureId”,
项目计数:
{
“$push”:
{
itemTypeId:“$\u id.itemTypeId”,
计数:“$count”
}
}
}
}).forEach(功能(文档){
var obj={
_id:doc.\u id,
itemCounts:{}
};
doc.itemCounts.forEach(函数(typeCount){
obj.itemCounts[typeCount.itemTypeId]=typeCount.count;
});
printjson(obj);
})
输出
{“_id”:1,“itemCounts”:{“Type1”:1,“Type2”:1}
{“_id”:2,“itemCounts”:{“Type1”:1}
db.items.aggregate([{$group:{_id:{itemTypeId:"$itemTypeId",manufactureId:"$manufactureId"},count:{$sum:1}}}])