Mongo聚合在数组元素上

17

我有一个 MongoDB 文档,例如:

{ "_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个回答

26

使用聚合操作,您无法获得所需的精确输出。聚合管道的一个限制是无法将 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}}
])

示例输出:

{
        "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
                }
        ]
}

非常感谢。还有一个问题,请问我们能否只获取一个特定位置的计数?比如海得拉巴2。 - SURYA GOKARAJU
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - BatScream
整数数组是否也适用于相同的方法?当我在整数数组上应用相同的方法时,我得到了这样的结果——未捕获的异常:聚合失败:{ “errmsg”:“exception:$unwind字段路径‘$list_id’末尾的值必须是一个数组,但是是一个NumberInt32”, “code”:15978, “ok”:0 } - SURYA GOKARAJU
@SURYAGOKARAJU - 是的,它可以应用于整数数组。错误似乎是因为某些文档在字段中具有整数值而不是数组而导致的。我们可以在这里进一步讨论:http://chat.stackoverflow.com/rooms/70508/mongodb。 - BatScream
如果“locations”是“mongo id”,我们想要填充“mongo id”的“name”,该怎么做?有什么建议吗? - Rakibul Haq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接