我认为这不是一个难题,但是我不确定该怎么做 我的收藏是
[
{ type:"bananas", weight:"1"},
{ type:"bananas", weight:"10"},
{ type:"apple", weight:"5"}
]
我想要的结果是同一查询中每种类型的计数,预期结果是
{
bananas: 2,
apple: 1
}
集合中有2种类型为“香蕉”的商品和1种类型为“苹果”的商品
所以我想我必须$ project我想要的道具(物品类型),但是我不知道如何计算/求和/匹配这个道具?
预先感谢您的帮助
答案 0 :(得分:2)
尝试如下:
db.collection.aggregate([
{
$group: {
_id: "$type",
count: { $sum:1 },
"data": {"$push": "$$ROOT" },
}
},
{
$project: {
"specList": {
"$arrayToObject": {
"$map": {
"input": "$data",
"as": "item",
"in": {
"k": "$$item.type",
"v": "$count",
}
}
}
}
}
},
{ $replaceRoot: { newRoot: { "$mergeObjects":[ "$specList" , { "item":"$_id"} ] } } }
])
答案 1 :(得分:1)
db.getCollection('test').aggregate([
{ $match: {} },
{ $group: { _id: "$type", count: { $sum: 1 }} },
{
$replaceRoot: {
newRoot: { $arrayToObject: [ [ { k: "$_id", v: "$count" } ] ]}
}
}
])
结果:
[{
"apple" : 1.0
},
{
"bananas" : 2.0
}]
合并合并
db.getCollection('test').aggregate([
{ $match: {} },
{ $group: { _id: "$type", count: { $sum: 1 }} },
{
$replaceRoot: {
newRoot: { $arrayToObject: [ [ { k: "$_id", v: "$count" } ] ]}
}
},
{ $facet: { items: [{$match: {} }]} },
{
$replaceRoot: { newRoot: { $mergeObjects: "$items" } }
},
])
结果:
[{
"apple" : 1.0,
"bananas" : 2.0
}]