Mongo聚合在数组元素上

SUR*_*AJU 9 mongodb aggregation-framework

我有一个类似的mongo文件

{ "_id" : 12, "location" : [ "Kannur","Hyderabad","Chennai","Bengaluru"] }
{ "_id" : 13, "location" : [ "Hyderabad","Chennai","Mysore","Ballary"] }
Run Code Online (Sandbox Code Playgroud)

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

Hyderabad 2, 
Kannur 1, 
Chennai 2, 
Bengaluru 1, 
Mysore 1, 
Ballary 1
Run Code Online (Sandbox Code Playgroud)

Bat*_*eam 11

使用聚合,您无法获得所需的确切输出.聚合管道的一个限制是它无法转换valueskeys输出文档.

例如,Kannurlocation输入文档中字段的值之一.在您想要的输出结构中,它需要是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}}
])
Run Code Online (Sandbox Code Playgroud)

样本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
                }
        ]
}
Run Code Online (Sandbox Code Playgroud)