2016-11-10 48 views
2

Mongodb限制結果編號我有一個具有多個層次結構的MongoDB集合,例如我將使用包含城市的國家集合,每個文檔是針對特定城市幷包含該國家的人口值和城市(例子中的country_pop和city_pop)這非常簡單,我實際上有6個層次結構和大量的數據。Mongodb限制結果編號與羣像

[ 
    { 
    "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年:6300萬
    • 2016年63500000

目前,我得到全部文件匹配{"country": "France"},所以在這個例子中,我會獲得6個條目。但實際上,在大量數據的情況下,獲得6個參賽作品是不好的,因爲我只能得到2個參賽作品,2015年之一和2016年之一(因爲country_pop的值在所有與{"year": "2016", "country": "France"}匹配的參賽作品中都是相同的

在我的測試過程中,我的php腳本使用了類似100mo的東西,以便在多年時間內生成我的值的時間線,這是不可接受的,我同意我的文檔結構不是很好,但我無法控制它。

是否有任何解決方案,像做一個 選擇country_pop ... GROUPBY(「國家」,「年」),以只得到最低限度的結果需要?

我在教義mongodb odm文檔中找到組查詢:http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/query-builder-api.html#group-queries但沒有真正的解釋。

此外,「組」方法https://docs.mongodb.com/v3.2/reference/method/db.collection.group/的mongo文檔似乎用於執行某些聚合,如總和或計數,而這不是我正在尋找的。

+0

你也許可以使用不同的查詢來實現這一點? 請看這裏:https://docs.mongodb.com/v3.2/reference/method/db.collection.distinct/ 請問爲什麼你試圖避免聚合?這似乎是完美的方式來獲得你正在尋找的輕鬆。 – dyouberg

+0

我不想通過查看文檔來避免聚集,它用於按國家=「法國」分組,並計算我有多少文檔:{「france」:6},我需要該值我的領域像「country_pop」......但也許我錯了! 編輯:也許我可以使用avg方法,如果它返回我的country_pop的平均值,並且都一樣,那麼可能是我正在尋找的結果 – iBadGamer

回答

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 } } 
+0

非常感謝!這正是我期待的! – iBadGamer

+0

你可以做很多聚合的東西 - 不要那麼快就打折!查看本教程中的郵政編碼數據集,看看這樣做的容易程度 - 獲取最高人口的郵政編碼,獲取州人口,獲取美國人口等。https:// docs.mongodb.com/v3.2/tutorial/aggregation-zip-code-data-set/ – dyouberg