MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongo DB:Wie kopiert man das Dokument aus einer Sammlung und fügt es als Feld zu einem verwandten Dokument aus einer anderen Sammlung hinzu?

Ab MongoDB 4.4 $merge kann in dieselbe Sammlung ausgegeben werden, die aggregiert wird:

db.products.aggregate([       
   { /**
    * from: The target collection.
    * localField: The local join field.
    * foreignField: The target join field.
    * as: The name for the results.
    * pipeline: The pipeline to run on the joined collection.
    * let: Optional variables to use in the pipeline field stages.
    */
   $lookup: {
     from: 'events',
     localField: '_id',
     foreignField: 'product_id',
     as: 'events'
   }},
   {/**
    * into: The target collection.
    * on: Fields to  identify.
    * whenMatched: Action for matching docs.
    * whenNotMatched: Action for non-matching docs.
    */
   $merge: {
     into: 'products',
     on: "_id",
     whenMatched: 'merge',
     whenNotMatched: 'insert'
   }}
])

Achtung: Wenn $merge in dieselbe Sammlung ausgegeben wird, die aggregiert wird, werden Dokumente möglicherweise mehrmals aktualisiert oder die Operation kann zu einer Endlosschleife führen. Weitere Einzelheiten hier https://docs .mongodb.com/manual/reference/operator/aggregation/merge/#merge-behavior-same-collection

Wenn es sich um eine einmalige Aktualisierung handelt, können Sie die Pipeline schützen, indem Sie als erste Stufe einen Anfangsfilter hinzufügen, um sicherzustellen, dass ein Dokument genau einmal aktualisiert wird:

{ $match: { events: { $exists: false } }