我有一个像
这样的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
答案 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
}
]
}