sql >> Database >  >> NoSQL >> MongoDB

Mongo DB:Hoe kopieer ik het document van de ene verzameling en voeg ik het als een veld toe aan een gerelateerd document uit een andere verzameling?

Vanaf MongoDB 4.4, $merge kan worden uitgevoerd naar dezelfde verzameling die wordt geaggregeerd:

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'
   }}
])

Let op: wanneer $merge uitvoer naar dezelfde verzameling die wordt geaggregeerd, kunnen documenten meerdere keren worden bijgewerkt of kan de bewerking resulteren in een oneindige lus. Meer details hier https://docs .mongodb.com/manual/reference/operator/aggregation/merge/#merge-behavior-same-collection

Als het een eenmalige update is, kunt u de pijplijn beveiligen door een eerste filter als eerste stap toe te voegen om ervoor te zorgen dat een document precies één keer wordt bijgewerkt:

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



  1. MongoDB gelijktijdige update naar hetzelfde document gedraagt ​​zich niet atomair

  2. Mongo:sorteren op extern gewicht

  3. MongoDB:een document vinden op een id in een genest document

  4. MongoDb streamt ingevoegde gegevens in realtime (of bijna realtime)