2013-05-03 14 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

を(damn's answer)(http://stackoverflow.com/a/35187100/3391108)と[Mongo's documentation](https://docs.mongodb.com/manual/reference/)からインスピレーションを得てください。オペレータ/集約/広告 – tscizzle

答えて

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は完全に異なるコマンドです(例:dToSet /#example)): 'db.collectionName.aggregate([{$ group:{_id:null、uniqueValues:{$ addToSet:" $ fieldName "}}}]異なる値の配列を返します。 – Sammaye

+0

これは私が以前に持っていたクエリですが、州ごとに異なる都市を取得する必要があります – Lemonio

+0

@Lemonio各都市のジップを返すようにする必要があります今の各州で – Sammaye

33

あなたは異なるオブジェクトをカウントする集約フレームワークで$addToSetを使用することができます

。たとえば、次のように

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

これは実際の解決策です。 – alfredopacino

+2

一般的な解決策ではありませんが、結果ごとにユニークな郵便番号が多数ある場合、この配列は非常に大きくなります。問題は、実際の郵便番号を取得するのではなく、州ごとにMOST郵便番号で都市を取得することでした。特定都市の郵便番号が10,000,000件の場合はどうなりますか? –

2

SQLクエリ:(明確なの&数によってグループ)

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

が同等のmongoクエリは次のようになります。モンゴの使用方法をお探しの方に

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