Започвайки от MongoDB 4.4, $merge може да изведе към същата колекция, която се агрегира:
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'
}}
])
Имайте предвид: когато $merge изведе към същата колекция, която се агрегира, документите може да се актуализират многократно или операцията може да доведе до безкраен цикъл. Повече подробности тук https://docs .mongodb.com/manual/reference/operator/aggregation/merge/#merge-behavior-same-collection
Ако това е еднократна актуализация, можете да защитите конвейера, като добавите начален филтър като първи етап, за да гарантирате, че документът се актуализира точно веднъж:
{ $match: { events: { $exists: false } }