MongoDB聚合:如何投影格式化的过滤器

时间:2019-04-10 09:48:06

标签: mongodb aggregate

我认为这不是一个难题,但是我不确定该怎么做 我的收藏是

[
 { type:"bananas", weight:"1"},
 { type:"bananas", weight:"10"},
 { type:"apple", weight:"5"}
]

我想要的结果是同一查询中每种类型的计数,预期结果是

{
  bananas: 2,
  apple: 1
}

集合中有2种类型为“香蕉”的商品和1种类型为“苹果”的商品

所以我想我必须$ project我想要的道具(物品类型),但是我不知道如何计算/求和/匹配这个道具?

预先感谢您的帮助

2 个答案:

答案 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
}]