Mongo聚合在数组元素上

时间:2015-01-03 07:50:05

标签: mongodb aggregation-framework

我有一个像

这样的mongo文档
{ "_id" : 12, "location" : [ "Kannur","Hyderabad","Chennai","Bengaluru"] }
{ "_id" : 13, "location" : [ "Hyderabad","Chennai","Mysore","Ballary"] }

从这里我如何获得位置聚合(不同的区域计数)。 像

这样的东西
Hyderabad 2, 
Kannur 1, 
Chennai 2, 
Bengaluru 1, 
Mysore 1, 
Ballary 1

1 个答案:

答案 0 :(得分:8)

使用聚合无法获得所需的确切输出。聚合管道的一个限制是它无法在输出文档中将values转换为keys

例如,Kannur是输入文档中location字段的值之一。在您想要的输出结构中,它必须是key("kannur":1)。使用聚合是不可能的。虽然这可用于实现map-reduce,但您可以使用聚合获得非常密切相关且有用的结构。

  • Unwind位置数组。
  • 位置字段
  • Group,获取各个位置的计数 使用$ sum运算符。
  • 再次
  • Group所有文档再次获得整合数组 结果。

代码:

db.collection.aggregate([
{$unwind:"$location"},
{$group:{"_id":"$location","count":{$sum:1}}},
{$group:{"_id":null,"location_details":{$push:{"location":"$_id",
                                               "count":"$count"}}}},
{$project:{"_id":0,"location_details":1}}
])

样本o / p:

{
        "location_details" : [
                {
                        "location" : "Ballary",
                        "count" : 1
                },
                {
                        "location" : "Mysore",
                        "count" : 1
                },
                {
                        "location" : "Bengaluru",
                        "count" : 1
                },
                {
                        "location" : "Chennai",
                        "count" : 2
                },
                {
                        "location" : "Hyderabad",
                        "count" : 2
                },
                {
                        "location" : "Kannur",
                        "count" : 1
                }
        ]
}