2016-11-22 29 views
4

usersを入力するためにMongoDB集計を使用したいと思います。 $lookup演算子を使用してcreatedByを入力するために簡単に使用できます。集計の集約クエリ

質問userのコメントに集計するために、$each演算子を集計などで使用する方法がありますか?

私はMongo 3.2で試しましたが、3.4のようなものの新しい機能になると読んだのでしょうか? $unwind$groups(これに成功しました)と同様のものを使用してエスケープして、クエリがスパゲッティコードにならないようにします。

ユーザー

{ 
    "_id" : ObjectId("582c31d4afd9252c8515a88b"), 
    "fullName": "test1" 
}, 
{ 
    "_id" : ObjectId("582c3db0afd9252c8515a88d"), 
    "fullName": "test2" 
} 

記事

{ 
    "_id" : ObjectId("5829cac7e9c0994d3db718f8"), 
    "imgUrl": "images/test.jpg", 
    "createdBy": ObjectId("582c31d4afd9252c8515a88b"), 
    "comments": [ 
     { 
      "_id" : ObjectId("5829cab8e9c0994d3db718f7"), 
      "content": "blabla", 
      "user": ObjectId("582c31d4afd9252c8515a88b") 
     } 
    ] 
} 

予想される出力

{ 
    "_id" : ObjectId("5829cac7e9c0994d3db718f8"), 
    "imgUrl": "images/test.jpg", 
    "createdBy": ObjectId("582c31d4afd9252c8515a88b"), 
    "comments": [ 
     { 
      "_id" : ObjectId("5829cab8e9c0994d3db718f7"), 
      "content": "blabla", 
      "user": { 
         "_id" : ObjectId("582c31d4afd9252c8515a88b"), 
         "fullName": "test1" 
        } 
     } 
    ] 
} 
+0

を使用するためのMongoDBの3.2.8以降のバージョンを持っていることを確認してください。あなたは詳細を教えていただけますか? – styvane

+0

@Styvaneフィールド 'user'は' users'コレクションのすべてのフィールドで上書きしたい "FK"のようなものです。 これは私が望む結果です... https://postimg.org/image/3n9bb9u0p/ –

+0

あなたの質問に[編集リンク](http://stackoverflow.com/posts/40736869/edit)してください期待される出力を追加する(画像ではない文書) – styvane

答えて

1

あなたは、あなたが解決策の下に使用することができますのMongoDB集約機能を使用したい場合。

db.getCollection('posts').aggregate([ 
    {"$unwind":{"path":"$comments","preserveNullAndEmptyArrays":true}}, 
    { $lookup: 
      { 
       from: 'users', 
       localField: 'comments.user', 
       foreignField:'_id', 
       as: 'comments.user' 
      } 
    }, 
    {"$unwind":{"path":"$comments.user","preserveNullAndEmptyArrays":true}}, 
    { 
      $group : { 
       _id : "$_id", 
       comments : {$push : "$comments"}, 
       imgUrl : {$first : "$imgUrl"}, 
       createdBy : {$first : "$createdBy"} 
      } 
    } 

]) 

私はあなたの質問を理解することはできませんあなたが$検索オプション

0

利用方法を移入マングース。

db.collections.find({}).populate([{path:"comments.user"}]). 
+0

ネイティブモンゴと一緒にやりたいです。 –