Kết hợp $addFields (thêm/sửa trường) với $filter (lọc mảng) để biến đổi mảng lồng nhau dựa trên điều kiện cross-reference.
Dữ liệu mẫu
> db.demo118.insertOne({
"Id" : "101", "Name" : "Chris",
"Subjects" : ["MySQL", "MongoDB", "Java"],
"Details" : [
{ "Name" : "David", "S": "MongoDB" },
{ "Name" : "Bob", "S": "Python" }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2f0c0cd8f64a552dae6364") }
Pipeline aggregate
> db.demo118.aggregate([
{ "$addFields": {
"Details": {
"$filter": {
"input": "$Details",
"as": "out",
"cond": { "$in": [ "$$out.S", "$Subjects" ] }
}
}
}}
]).pretty();
Kết quả
{ "_id" : ObjectId("5e2f0c0cd8f64a552dae6364"), "Id" : "101", "Name" : "Chris", "Subjects" : [ "MySQL", "MongoDB", "Java" ], "Details" : [ { "Name" : "David", "S" : "MongoDB" } ] }
Giải thích:
$addFields: Thay thế trườngDetailsbằng kết quả lọc$filter: Duyệt mảng Details, biến$$outlà phần tử hiện tại$in: ["$$out.S", "$Subjects"]: Kiểm tra S của phần tử có trong mảng Subjects gốc không- Chỉ giữ David (MongoDB ∈ Subjects), loại Bob (Python ∉ Subjects)
Ứng dụng: Lọc dữ liệu con dựa trên danh sách tham chiếu (whitelist/blacklist), làm sạch dữ liệu, join mảng cục bộ.