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