Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Dùng $addFields và $filter trong MongoDB aggregate

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ường Details bằng kết quả lọc
  • $filter: Duyệt mảng Details, biến $$out là 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ộ.