4

次のクエリがあります。

db.listener.aggregate(
[
    { "$match" : { "location.countryName" : "Italy" } },
    { "$project" : { "location" : "$location"} },
    { "$group" : { "_id" : { "country": "$location.countryName", "city": "$location.cityName" }, "count" : { "$sum" : 1 }, "co-ords" : { "$addToSet" : { "lat" : "$location.latitude", "long" : "$location.longitude" } } } },
    { "$group" : { "_id" : "$_id.country", "cities" : { "$push" : { "city" : "$_id.city", "count" : "$count", "co-ords" : "$co-ords" } } } },
    { "$sort" : { "_id" : 1 } },
]

)

次の結果が得られます (切り捨てられます)。

{
"result" : [
    {
        "_id" : "Italy",
        "cities" : [
            {
                "city" : "Seriate",
                "count" : 1,
                "co-ords" : [
                    {
                        "lat" : "45.6833",
                        "long" : "9.7167"
                    }
                ]
            },
            {
                "city" : "Milan",
                "count" : 3,
                "co-ords" : [
                    {
                        "lat" : "45.4612",
                        "long" : "9.1878"
                    },
                    {
                        "lat" : "45.4667",
                        "long" : "9.2"
                    }
                ]
            },

ミラノ市の例でわかるように、合計都市数は 3 ですが、経度/緯度セットの数は 2 です。つまり、より正確な場所の 1 つには 2 つのインスタンスがあり、もう 1 つの場所には 1 つのインスタンスがあります。ここで、緯度/経度ごとのインスタンス数と全体の数を反映するようにクエリを修正する必要があります。次のようになります。

{
                "city" : "Milan",
                "count" : 3,
                "co-ords" : [
                    {
                        "lat" : "45.4612",
                        "long" : "9.1878",
                        "total" : 2
                    },
                    {
                        "lat" : "45.4667",
                        "long" : "9.2",
                        "total" : 1
                    }
                ]
            },

これを達成するためにいくつかのことを試しましたが、思い通りにならないか、Mongo がエラーをスローします。これを行う最良の方法を知っている人はいますか?

どうもありがとう、

ニック。

4

1 に答える 1

5
db.listener.aggregate(
[
    { "$match" : { "location.countryName" : "Italy" } },
    { "$group" : { "_id" : { "country": "$location.countryName", 
                             "city": "$location.cityName", 
                             "coords": { "lat" : "$location.latitude", "long" : "$location.longitude" } 
                   }, 
                   "count" : { "$sum" : 1 } 
                 }
    },
    { "$group" : { "_id" : { "country": "$_id.country", "city": "$_id.city" }, 
                   "coords": { "$addToSet" : { "long" : "$_id.coords.long", 
                                               "lat" : "$_id.coords.lat",
                                               "total" : "$count" 
                                             }
                             },  
                             "count" : { "$sum" : "$count" } 
                 }
    },
    { "$group" : { "_id" : "$_id.country", 
                   "cities" : { "$push" : { "city" : "$_id.city", 
                                "count" : "$count", 
                                "coords" : "$coords" } } } },
    { "$sort" : { "_id" : 1 } },
]);

これからのデータのサンプル出力:

{   "_id" : "Italy",
    "cities" : [
        {
            "city" : "Seriate",
            "count" : 1,
            "coords" : [
                {
                    "long" : "9.7167",
                    "lat" : "45.6833",
                    "total" : 1
                }
            ]
        },
        {
            "city" : "Milan",
            "count" : 3,
            "coords" : [
                {
                    "long" : "9.1878",
                    "lat" : "45.4612",
                    "total" : 1
                },
                {
                    "long" : "9.2",
                    "lat" : "45.4667",
                    "total" : 2
                }
            ]
        }
    ]
}
于 2013-11-13T18:01:23.963 に答える