Mongodb使用groupby

时间:2016-11-10 15:30:01

标签: mongodb group-by distinct doctrine-odm

我有一个具有多个层次结构的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脚本值以显示类似的内容:

  • 法国:
    • 2015:63000000
    • 2016:63500000

目前,我获得了匹配{"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这样的聚合,而不是我想要的。

1 个答案:

答案 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 } }