2013-05-03 80 views
15

我只是學習MongoDB的一個任務,我工作的一個查詢,以找到最拉鍊城市每個狀態MongoDB的不同聚集

db.zips.distinct("state", db.zips.aggregate([ {$group:{_id:{state:"$state", city:"$city"},numberOfzipcodes:{$sum:1}}}, {$sort:{numberOfzipcodes:-1}}])) 

查詢的彙總部分似乎做工精細,但是當我添加不同的時候,我得到一個空的結果。這是因爲我有身份在ID?我可以這樣做不同的(「_ id.state ?? 或者你有任何其他提示?

謝謝!

+1

對於那些尋找如何使用蒙戈的聚合獲得不同的值,試試這個(從[dam1的回答](http://stackoverflow.com/a/35187100/3391108)和[Mongo的文檔](https://docs.mongodb.com/manual/reference/運營商/匯聚/廣告dToSet /#example)): 'db.collectionName.aggregate([{$ group:{_id:null,uniqueValues:{$ addToSet:「$ fieldName」}}}])' – tscizzle 2017-02-08 17:35:34

回答

23

鮮明和聚合框架不是可互操作的。

相反,你只是想:

db.zips.aggregate([ 
    {$group:{_id:{city:'$city', state:'$state'}, numberOfzipcodes:{$sum:1}}}, 
    {$sort:{numberOfzipcodes:-1}}, 
    {$group:{_id:'$_id.state', city:{$first:'$_id.city'}, 
       numberOfzipcode:{$first:'$numberOfzipcodes'}}} 
]); 
+5

@ alex23 Distinct是一個完全不同的命令它返回一個不同值的數組。這是完全不兼容的聚合框架 – Sammaye 2013-05-03 23:01:29

+0

這是我以前的查詢,但我需要得到每個州的不同州,而不是州 – Lemonio 2013-05-03 23:01:43

+0

@Lemonio加回城市,這應該放棄在每個城市的拉鍊在現在的每個國家 – Sammaye 2013-05-03 23:02:38

33

您可以使用$addToSet與聚合框架來計算不同的對象

。例如:

db.collectionName.aggregate([{ 
    $group: {_id: null, uniqueValues: {$addToSet: "$fieldName"}} 
}]) 
+1

這是實際的解決方案。 – alfredopacino 2016-04-14 23:00:19

+2

不是一個通用的解決方案,如果每個結果都有大量的唯一郵政編碼,則此數組將非常大。問題是要讓這個城市擁有每個州最多的郵政編碼,而不是真正的郵政編碼。如果某個城市擁有10,000,000個郵政編碼,會發生什麼情況? – 2016-09-06 07:50:43

2

SQL查詢:(由不同&次數羣)

select city,count(distinct(emailId)) from TransactionDetails group by city; 

等效蒙戈查詢應該是這樣的:

db.TransactionDetails.aggregate([ 
{$group:{_id:{"CITY" : "$cityName"},uniqueCount: {$addToSet: "$emailId"}}}, 
{$project:{"CITY":1,uniqueCustomerCount:{$size:"$uniqueCount"}} } 
]);