2017-09-14 11 views
0

私は、次の文書構造を持つ2つのコレクションがあります。 コメント集:コレクションをマージして同じドキュメントスキーマを取得するにはどうすればよいですか?

{ 
    "_id" : ObjectId("59bab6c6d41dce6422af08cd"), 
    "userId" : 12345.0, 
    "comment" : "Hey, what's up?", 
    "created" : ISODate("2017-09-14T17:05:10.820+0000") 
} 
{ 
    "_id" : ObjectId("59bab6c6d41dce6422af08ce"), 
    "userId" : 123456.0, 
    "comment" : "Not much", 
    "created" : ISODate("2017-09-14T17:05:10.855+0000") 
} 
{ 
    "_id" : ObjectId("59bab6c6d41dce6422af08cf"), 
    "userId" : 12345678.0, 
    "comment" : "Cool", 
    "created" : ISODate("2017-09-14T17:05:10.889+0000") 
} 
{ 
    "_id" : ObjectId("59bab6c6d41dce6422af08d0"), 
    "userId" : 12.0, 
    "comment" : "Nothing", 
    "created" : ISODate("2017-09-14T17:05:10.931+0000") 
} 

ユーザーコレクション:

{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d1"), 
    "unique_Id" : 12345.0, 
    "firstName" : "Rich", 
    "lastName" : "S", 
    "gender" : "M", 
    "country" : "CA", 
    "age" : "18" 
} 
{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d2"), 
    "unique_Id" : 123456.0, 
    "firstName" : "Rob", 
    "lastName" : "M", 
    "gender" : "M", 
    "country" : "US", 
    "age" : "25" 
} 
{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d3"), 
    "unique_Id" : 12345.0, 
    "firstName" : "Sarah", 
    "lastName" : "T", 
    "gender" : "F", 
    "country" : "US", 
    "age" : "13" 
} 

を私はそれらを結合し、同じ文書スキーマは、後に参加従うためにそれらを必要とすることを試みました。 私は

db.getCollection('users').aggregate([ 
    { 
     $lookup: { 
      from: "comments", 
      localField: "unique_Id", 
      foreignField: "userId", 
      as: "goldStandard" 
     } 

    }, 
    { $out : "test2"} 
]) 

出力ました:今

{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d1"), 
    "unique_Id" : 12345.0, 
    "firstName" : "Rich", 
    "lastName" : "S", 
    "gender" : "M", 
    "country" : "CA", 
    "age" : "18", 
    "goldStandard" : [ 
     { 
      "_id" : ObjectId("59bab6c6d41dce6422af08cd"), 
      "userId" : 12345.0, 
      "comment" : "Hey, what's up?", 
      "created" : ISODate("2017-09-14T17:05:10.820+0000") 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d2"), 
    "unique_Id" : 123456.0, 
    "firstName" : "Rob", 
    "lastName" : "M", 
    "gender" : "M", 
    "country" : "US", 
    "age" : "25", 
    "goldStandard" : [ 
     { 
      "_id" : ObjectId("59bab6c6d41dce6422af08ce"), 
      "userId" : 123456.0, 
      "comment" : "Not much", 
      "created" : ISODate("2017-09-14T17:05:10.855+0000") 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d3"), 
    "unique_Id" : 12345.0, 
    "firstName" : "Sarah", 
    "lastName" : "T", 
    "gender" : "F", 
    "country" : "US", 
    "age" : "13", 
    "goldStandard" : [ 
     { 
      "_id" : ObjectId("59bab6c6d41dce6422af08cd"), 
      "userId" : 12345.0, 
      "comment" : "Hey, what's up?", 
      "created" : ISODate("2017-09-14T17:05:10.820+0000") 
     } 
    ] 
} 

を、コレクションの文書「からは、」配列型のフィールド名「として」下のオブジェクトとして追加されます。 $ unwindを使って配列を巻き戻すと、オブジェクトとして与えられます。私はオブジェクトとしてなりたくありません。代わりに、最終文書が結合後に次の構造を持つようにします。$ lookup &共通の列の条件が一致するフィールドを組み合わせて、重複するフィールドを避ける必要があります。新しいフィールドが新しいドキュメントに追加されます。例:

{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d1"), 
    "unique_Id" : 12345.0, 
    "firstName" : "Rich", 
    "lastName" : "S", 
    "gender" : "M", 
    "country" : "CA", 
    "age" : "18", 
    "comment" : "Hey, what's up?", 
    "created" : ISODate("2017-09-14T17:05:10.820+0000") 
} 
{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d2"), 
    "unique_Id" : 123456.0, 
    "firstName" : "Rob", 
    "lastName" : "M", 
    "gender" : "M", 
    "country" : "US", 
    "age" : "25", 
    "comment" : "Not much", 
    "created" : ISODate("2017-09-14T17:05:10.855+0000") 
} 
{ 
    "_id" : ObjectId("59bab74cd41dce6422af08d3"), 
    "unique_Id" : 12345.0, 
    "firstName" : "Sarah", 
    "lastName" : "T", 
    "gender" : "F", 
    "country" : "US", 
    "age" : "13", 
    "comment" : "Hey, what's up?", 
    "created" : ISODate("2017-09-14T17:05:10.820+0000") 
} 

お勧めします。

+0

ような何かそれは集計演算子を使用して可能である[$ mergeObject](https://docs.mongodb.com/master/reference/operator/aggregation/mergeObjects/#definitionに)それは今後の3.6リリースになります。それがあなたのオプションであるかどうかは確かではありません。 – Veeram

答えて

1

今後のリリース予定の$mergeObject演算子を使用できます。

$mergeObjectフィールドを結合されたコレクションフィールドとマージし、次に$replaceRootを組み合わせて、結合されたドキュメントをトップレベルに昇格させます。

$project除外を指定してgoldStandardフィールドを削除し、$outを新しいコレクションに書き込むことができます。 3.5開発版で

db.getCollection('users').aggregate([ 
    { 
    "$lookup": { 
     "from": "comments", 
     "localField": "unique_Id", 
     "foreignField": "userId", 
     "as": "goldStandard" 
    } 
    }, 
    { 
    "$replaceRoot": { 
     "newRoot": { 
     "$mergeObjects": [ 
      "$$ROOT", 
      { 
      "$arrayElemAt": [ 
       "$goldStandard", 
       0 
      ] 
      } 
     ] 
     } 
    } 
    }, 
    { 
    "$project": { 
     "goldStandard": 0 
    } 
    }, 
    { 
    "$out": "test2" 
    } 
]) 
+0

私はそれの実装をチェックするが、今この将来の機能を使う方法は?私はバージョン3.4.6で$ mergeObjectsを実行すると次のようなエラーが発生します:認識できない式 '$ mergeObjects' ' – Anubhav

+0

3.5デベロッパーシリーズで入手できます。こちらは[こちら](https://www.mongodb.org/dl)からダウンロードできます。/win32/x86_64-2008plus-ssl)詳細情報[ここ](https://docs.mongodb.com/master/release-notes/3.6/) – Veeram

関連する問題