简体   繁体   English

Mongodb汇总,分组和计数实例

[英]Mongodb aggregate, group and count instances

I have a document which looks like this: 我有一个看起来像这样的文件:

{
    "_id" : ObjectId("527a6b7c24a8874c078b9d10"),
    "day" : 6,
    "hour" : 15,
    "hourlyLocations" : [
        {
            "countryName" : "Spain",
            "countryCode" : "ES",
            "cityName" : "Madrid",
            "latitude" : 40,
            "longitude" : -4
        },
        {
            "countryName" : "United Kingdom",
            "countryCode" : "GB",
            "cityName" : "Soest",
            "latitude" : 51.5,
            "longitude" : -0.13
        }
    ],
    "minute" : 18,
    "month" : 11,
    "year" : 2013
}

"hourlyLocations" is a series of embedded documents (just two shown here for brevity). “ hourlyLocations”是一系列嵌入式文档(为简洁起见,此处仅显示两个)。

I'm trying to run an aggregation which will return each country, all the cities in that country (once) and the number of instances of each city. 我正在尝试进行汇总,该汇总将返回每个国家/地区,该国家/地区的所有城市(一次)以及每个城市的实例数。

Here's what I've got so far: 到目前为止,这是我得到的:

db.hourly.aggregate(
[
    { "$project" : { "hourly" : "$hourlyLocations" } },
    { "$unwind" : "$hourly" },
    { "$group" : { "_id" : { "country" : "$hourly.countryName" }, "city" : { "$push" : "$hourly.cityName" } } },
]
)

This returns something like: 这将返回类似:

{
        "_id" : {
            "country" : "Italy"
        },
        "city" : [
            "Manzano",
            "Cologno Monzese",
            "Rome",
            "Manzano",
            "Cologno Monzese",
            "Venice",
            "Milan",
            "Rome",
            "Milan",
            "Manzano",
            "Cologno Monzese",
            "Venice",
            "Milan",
            "Rome",
            "Milan",
            "Manzano",
            "Cologno Monzese",
            "Venice",
            "Milan",
            "Rome",
            "Manzano",
            "Cologno Monzese",
            "Venice",
            "Milan",
            "Casalnuovo di Napoli",
            "Manzano",
            "Cologno Monzese",
            "Venice",
            "Milan",
            "Casalnuovo di Napoli",
            "Milan"
        ]
    }

So I've got all the instances of all the cities grouped by city. 因此,我具有按城市分组的所有城市的所有实例。 What I want to do now is to group by, and count, the number of instances of each city. 我现在想做的是对每个城市的实例数量进行分组和计数。 Something like this: 像这样:

{
        "_id" : {
            "country" : "Italy"
        },
        "city" : [
            "Casalnuovo di Napoli" : "12"
            "Cologno Monzese" : "10",
            "Manzano" : "9",
            "Milan" : "6",
            "Rome" : "3",
            "Venice" : "1"
        ]
    }

I've tried a few things but haven't been able to get it right. 我已经尝试了一些方法,但未能正确完成。 How can I get the count of each city per country as I require? 我如何根据需要获取每个国家/地区的每个城市的数量?

Many thanks, 非常感谢,

Nick. 缺口。

Try: 尝试:

db.hourly.aggregate(
[
    { "$project" : { "hourly" : "$hourlyLocations" } },
    { "$unwind" : "$hourly" },
    { $group: { _id: { country: "$hourly.countryName", city: "$hourly.cityName" }, count: { $sum: 1 } } },
    { $sort: { count: -1 } },
    {  $group: { _id: "$_id.country", cities: { $push: { city: "$_id.city", count: "$count"  } }  } }
]
)

It's not quite the requested structure. 这不是所要求的结构。 Instead you get: 相反,您得到:

{
    "_id" : {
        "country" : "Italy"
    },
    "cities" : [
        { "city": "Cologno Monzese", "count": 12},
        { "city": "Milan", "count": 6},
        { "city": "Rome", "count": 3},
    ]
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM