我有这样的文件:
{
u '_id': ObjectId('5534cd32e4b0d5f14e6aa27d'),
u 'geoip': {
u 'coordinates': [-96.8353,
32.9299
],
u 'region_name': u 'TX',
u 'latitude': 32.9299,
u 'ip': u '173.193.154.240',
u 'area_code': 972,
u 'continent_code': u 'NA',
u 'country_code3': u 'USA',
u 'country_code2': u 'US',
u 'city_name': u 'Dallas',
u 'longitude': -96.8353,
u 'timezone': u 'America/Chicago',
u 'country_name': u 'UnitedStates',
u 'postal_code': u '75244',
u 'real_region_name': u 'Texas',
u 'dma_code': 623,
u 'location': [-96.8353,
32.9299
]
},
u 'dest_ip': u '173.193.154.240'
}
我想要实现的是...... group by country name
期望的输出:
{
'country_name': 'US',
'count': 110,
'location': [10, 10]
}
我现在正在做的是:
db.collection.aggregate([
{
"$group": {
"_id": {"country_name": "$geoip.country_name"},
"count": {"$sum": 1},
},
}
])
这样可行,但不会给我这个位置。如果我想要位置,我会这样做:
"_id": {"country_name": "$geoip.country_name", "location": "$geoip.location"}
但问题是我们有很多地点(different latitude and longitude) in the same country_name.
所以,我想要的只是one latitude and longitude with the country name.
我怎样才能做到这一点?
答案 0 :(得分:0)
如果您只想要一个纬度经度对,可以使用$first
accumulator operator:
db.collection.aggregate([
{
"$group": {
"_id": {"country_name": "$geoip.country_name"},
"count": {"$sum": 1},
"longitude": {"$first": "$longitude"},
"latitude": {"$first": "$latitude"}
}
}
])
使用$first
可以保证经度和纬度都来自相同的文档。还有一个$last
operator,但我认为在这里使用它没什么好处。
最后,引用文档:“在$ group阶段使用$ first [resp:$ last]时,$ group阶段应遵循$ sort阶段,以按照定义的顺序输入文档。 “但是根据你的描述,这里不需要。