2016-10-12 8 views
1

私はコレクションのユーザーと番号を持っています。各番号にはAllocatedToUserId(ObjectId)フィールドがあり、ユーザーは多数の番号を持つことができます。 NumbersCountを使用して単一クエリでユーザーを返すにはどうすればよいですか?私はこのMongoDB集計数

db.getCollection('Users').aggregate([ 
     {'$lookup': {from: "Numbers", 
        localField: "_id", 
        foreignField: "AllocatedToUserId", 
        as: "Numbers"} 
     },{ '$project' : {_id:0, 
         document: '$$ROOT', 
         count: {$size:'$Numbers'}}} 
     ]) 

を書いた。しかし、このコードで私はそのような応答の構造を得た:

documentNumbersコレクションを持っている、と私は documentcountを持っているしたいと思います

[{document, count},{document, count},{document, count}...]

をなしののコレクション。出来ますか?ありがとう!

答えて

1

$$ROOTというシステム変数を持つ別のフィールドを必ずしも投影する必要はなく、ユーザースキーマのフィールドを投影するだけです。

Exmpleユーザースキーマ

{ 
    "_id": ObjectId 
    "firstName": String, 
    "lastName": String, 
    "age": Integer, 
    "location": String 
} 

パイプライン

db.getCollection('Users').aggregate([ 
    { 
     "$lookup": { 
      "from": "Numbers", 
      "localField": "_id", 
      "foreignField": "AllocatedToUserId", 
      "as": "Numbers" 
     } 
    }, 
    { 
     "$project": { 
      "firstName": 1, 
      "lastName": 1, 
      "age": 1, 
      "location": 1, 
      "Numbers": 0, 
      "count": { "$size": "$Numbers" } 
     } 
    } 
]) 
+0

ありがとう:次の例では、スキーマを持つユーザーを持っていると仮定し!うん、それはおそらく解決策ですが、私のユーザースキーマは〜25のフィールドを持っています。だから私は$$ ROOTを使ったのです。 – Raft

+0

'$$ ROOT'では、' document'埋め込み文書を平らにするための別の '$ project'パイプラインをまだ残していました – chridam

+0

それはおそらく最高の解決策ですか? – Raft