mongodb-聚合得到计数。

时间:2015-09-08 20:49:58

标签: mongodb aggregation-framework

我一直在学习mongodb,我有点不耐烦地写了一个查询。

我有以下系列:

{
    _id : 1,
    House: A,
    inventory: [
        {
            place: Kitchen,
            item: fridge
        },
        {
            place: Kitchen,
            item: stove
        },
        {
            place: Kitchen,
            item: TV
        },
        {
            place: Bedroom,
            item: bed
        },
        {
            place: Bedroom,
            item: TV
        }
    ]
},
{
    _id : 2,
    House: B,
    inventory: [
        {
        ....
        }
    ]
},

如何编写查询以返回“地点”和“项目”的计数?所以输出应该是这样的:
{id:Kitchen,PlaceCount:3,itemCount:3} - 3个厨房,3件(冰箱,炉灶,电视)
{id:Bedroom,PlaceCount:2,itemCount:2} - 2卧室,2件(床,电视)

我需要在每个地方计算电视数量。

1 个答案:

答案 0 :(得分:1)

您应该使用Aggregation Pipeline,它允许您通过传递数组的多个步骤聚合数据。

您的汇总应该是:

db.your_collection.aggregate([
  {$unwind: "$inventory" },
  {$group: { _id: "$inventory.place", placeCount:{$sum : 1}, items : {$push: "$inventory.item"}}},
  {$project: { placeCount: 1, itemsCount : {$size: "$items"}}}
])

说明:

  1. $unwind为每个广告资源元素生成一个结果
  2. $group按地点展开未库存的广告资源元素,需要计算(使用$sum)和一系列项目(仍然按地点,使用$push
  3. $project以上步骤的分组结果的以下数据:placeCount和items数组的大小(使用$size),即itemsCount