Bắt đầu từ MongoDB 4.4, $ hợp nhất có thể xuất ra cùng một bộ sưu tập đang được tổng hợp:
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'
}}
])
Hãy lưu ý: khi $ merge đầu ra cho cùng một bộ sưu tập đang được tổng hợp, các tài liệu có thể được cập nhật nhiều lần hoặc hoạt động có thể dẫn đến một vòng lặp vô hạn. Thông tin chi tiết tại đây https:// docs .mongodb.com / manual / reference / operator / aggregation / merge / # merge-behavior-same-collection
Nếu đó là bản cập nhật một lần, bạn có thể bảo vệ đường dẫn bằng cách thêm bộ lọc ban đầu làm giai đoạn đầu tiên để đảm bảo tài liệu được cập nhật chính xác một lần:
{ $match: { events: { $exists: false } }