2017-09-16 11 views
0

私はドキュメントの一部を保存する方法を知りたいので、$ lookupメソッドが私に返します。ここに例があります:

eOTD_termコレクションに省略形配列のみを保存するにはどうすればよいですか?

例:

私は2つのコレクションを持っています。 doc from eOTD_abbreviation

{ 
     "_id" : ObjectId("59bc32fd7d7934a6a7a47d08"), 
     "abbreviationID" : "0161-1#AB-000282#1", 
     "termID" : "0161-1#TM-623205#1", 
     "abbreviation" : "CONSTR,LGHT" 
    } 

ex。 eOTD_term

{ 
    "_id" : ObjectId("59bc2d7e7d7934a6a7777540"), 
    "termID" : "0161-1#TM-623205#1", 
    "conceptID" : "0161-1#01-082401#1", 
    "term" : "CONSTRUCT,LIGHT", 
} 

termIDからのドキュメントは両方のコレクションに存在する私の一意のキーです。 (ドキュメントの1集約リターン)

db.eOTD_term.aggregate([ 
    { 
    $lookup: { 
     from: "eOTD_abbreviation", 
     localField: "termID", 
     foreignField: "termID", 
     as: "abbreviation" 
    } 
    }, 
    { 
    $match: { abbreviation: { $ne: [] } } 
    } 
]); 

そして、私は戻って取得::

は、私は、次の試してみました

{emphasized text 
    "_id" : ObjectId("59bc2d7e7d7934a6a7777540"), 
    "termID" : "0161-1#TM-623205#1", 
    "conceptID" : "0161-1#01-082401#1", 
    "term" : "CONSTRUCT,LIGHT", 
    "abbreviation" : [ <----------- THIS ARRAY 
     { 
      "_id" : ObjectId("59bc32fd7d7934a6a7a47d08"), 
      "abbreviationID" : "0161-1#AB-000282#1", 
      "termID" : "0161-1#TM-623205#1", 
      "abbreviation" : "CONSTR,LGHT" 
     } 
    ] 
} 

答えて

1

これはeOTD_termに戻っ略語配列の内容を保存します。

db.eOTD_term.insertMany(
    db.eOTD_term.aggregate([ 
     { 
     $lookup: { 
      from: "eOTD_abbreviation", 
      localField: "termID", 
      foreignField: "termID", 
      as: "abbreviation" 
     } 
     }, 
     { 
     $match: { abbreviation: { $ne: [] } } 
     }, 
     { 
     $unwind: "$abbreviation" 
     }, 
     { 
     $replaceRoot: { newRoot: "$abbreviation" } 
     }, 
    ]).result, 
    { 
    ordered: false <-- prevents from failing on unique constraints 
    } 
) 

集計の結果が大きければ、メモリが不足する可能性があります。 How do I append Mongo DB aggregation results to an existing collection?

+1

単に置く '$が直接、次のunwind'' $のlookup'が冗長 '$のmatch'と多くを作ることに留意すべきである:

また、代わりにinsertManyの段階を「$をアウト」を使用して試すことができます[MongoDBが実際にその組み合わせを内部的にどのように処理するか](https://docs.mongodb.com/manual/core/aggregation-pipeline-optimization/#lookup-unwind-coalescence)のために効率的です。新しい "ルート"の '_id'値が一意でない場合には' $ out'は失敗しますが、一般的に "バッチ処理"要求なしで "すべて"の結果を '.insertMany()'に送る方が望ましいでしょう。 –

関連する問題