Mongo 数组元素聚合

Mongo aggregation on array elements

我有一个 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

使用聚合您无法获得所需的确切输出。聚合管道的局限性之一是无法将输出文档中的 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
                }
        ]
}