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 } }