我有一个具有多个层次结构的MongoDB集合,例如我将使用包含城市的国家/地区的集合,每个文档都针对特定城市并包含国家和城市的人口价值(country_pop和city_pop in例子)这是非常简化的,实际上我有6个层次结构和大量数据。
[
{
"country": "France",
"city": "Paris",
"country_pop": 63000000,
"city_pop": 2200000,
"year": 2015
},
{
"country": "France",
"city": "Marseille",
"country_pop": 63000000,
"city_pop": 850726,
"year": 2015
},
{
"country": "France",
"city": "Toulouse",
"country_pop": 63000000,
"city_pop": 441802,
"year": 2015
},
{
"country": "France",
"city": "Paris",
"country_pop": 63500000,
"city_pop": 2350000,
"year": 2016
},
{
"country": "France",
"city": "Marseille",
"country_pop": 63500000,
"city_pop": 880726,
"year": 2016
},
{
"country": "France",
"city": "Toulouse",
"country_pop": 63500000,
"city_pop": 445802,
"year": 2016
}
]
我目前正在使用doctrine mongo odm来将我的文档水化为Php对象,但这不是必需的。 我想要实现的是获取我的php脚本值以显示类似的内容:
目前,我获得了匹配{"country": "France"}
的所有文档,因此在此示例中,我将获得6个条目。但实际上,有大量数据,获得6个条目有点不好,我只能得到两个,2015年和2016年之一(因为country_pop的值在所有匹配的条目中都是相同的{ {1}}
在我测试期间,我的php脚本使用类似100mo的东西来生成多年来我的值的时间轴,这是不可接受的。我同意我的文件结构不是很好,但我无法控制它。
是否有任何解决方案可以做类似的事情 选择country_pop ... groupBy(“country”,“year”)以获得所需的最低结果?
我在doctrine mongodb odm文档中找到了组查询:http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/query-builder-api.html#group-queries但是没有真正的解释。
“group”方法https://docs.mongodb.com/v3.2/reference/method/db.collection.group/的mongo文档似乎也被用来做一些像sum或count这样的聚合,而不是我想要的。
答案 0 :(得分:2)
首先尝试使用此功能,如果您需要任何其他数据,请告诉我们:
db.collectionName.aggregate([
{
$group: {
"_id": {
"Country": "$country",
"Year": "$year",
"CountryPop": "$country_pop"
}
}
}
])
这会按国家/地区,年份和国家/地区的人口对结果进行分组,并为您的数据集生成以下内容:
{ "_id" : { "Country" : "France", "Year" : 2016, "CountryPop" : 63500000 } }
{ "_id" : { "Country" : "France", "Year" : 2015, "CountryPop" : 63000000 } }