gpt4 book ai didi

mongodb - "Structured"MongoDB分组查询

转载 作者:可可西里 更新时间:2023-11-01 10:42:41 27 4
gpt4 key购买 nike

我有以下项目集合:

[{
"_id": 1,
"manufactureId": 1,
"itemTypeId": "Type1"
},
{
"_id": 2,
"manufactureId": 1,
"itemTypeId": "Type2"
},
{
"_id": 3,
"manufactureId": 2,
"itemTypeId": "Type1"
}]

我想创建一个查询,该查询将返回每个制造商在以下结构(或类似结构)中具有的每种商品类型的商品数量:

[
{
_id:1, //this would be the manufactureId
itemsCount:{
"Type1":1, //Type1 items count
"Type2":1 //...
}
},
{
_id:2,
itemsCount:{
"Type1":1
}
}
]

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

db.items.aggregate([{$group:{_id:{itemTypeId:"$itemTypeId",manufactureId:"$manufactureId"},count:{$sum:1}}}])

但如果可能的话,我不想对结果进行后处理。

最佳答案

数据就是数据

我宁愿使用这个查询,我相信它会为您提供最接近您想要的数据结构,而无需进行后处理。

查询

db.items.aggregate(
{
$group:
{
_id:
{
itemTypeId: "$itemTypeId",
manufactureId: "$manufactureId"
},
count:
{
$sum: 1
}
},
},
{
$group:
{
_id: "$_id.manufactureId",
itemCounts:
{
"$push":
{
itemTypeId: "$_id.itemTypeId",
count: "$count"
}
}
}
})

输出

{
"_id" : 1,
"itemCounts" : [
{
"itemTypeId" : "Type1",
"count" : 1
},
{
"itemTypeId" : "Type2",
"count" : 1
}
]
},
{
"_id" : 2,
"itemCounts" : [
{
"itemTypeId" : "Type1",
"count" : 1
}
]
}

数据转换为对象字段

实际上,我通常不建议采用这种方法。在您的应用程序中更难管理,因为不同对象之间的字段名称会不一致,并且您不会提前知道期望的对象字段。如果您使用强类型语言,这将是一个关键点——自动数据绑定(bind)到您的域对象将变得不可能。

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

查询

db.items.aggregate(
{
$group:
{
_id:
{
itemTypeId: "$itemTypeId",
manufactureId: "$manufactureId"
},
count:
{
$sum: 1
}
},
},
{
$group:
{
_id: "$_id.manufactureId",
itemCounts:
{
"$push":
{
itemTypeId: "$_id.itemTypeId",
count: "$count"
}
}
}
}).forEach(function(doc) {
var obj = {
_id: doc._id,
itemCounts: {}
};

doc.itemCounts.forEach(function(typeCount) {
obj.itemCounts[typeCount.itemTypeId] = typeCount.count;
});

printjson(obj);
})

输出

{ "_id" : 1, "itemCounts" : { "Type1" : 1, "Type2" : 1 } }
{ "_id" : 2, "itemCounts" : { "Type1" : 1 } }

关于mongodb - "Structured"MongoDB分组查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34239487/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com