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

Chiếu (Projection) trên thuộc tính lồng nhau cụ thể trong MongoDB

Để chiếu chỉ các thuộc tính lồng sâu thỏa mãn điều kiện, dùng aggregation với $addFields, $objectToArray, $filter, $arrayToObject.

Tạo collection với object lồng sâu:

> db.demo379.insertOne({
  "details1" : {
    "details2" : {
      "details3" : {
        "10" : "John", "50" : "Chris", "40" : "David", "30": "Mike"
      }
    }
  }
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5a94f82ae06a1609a00b10") }

Xem dữ liệu:

> db.demo379.find().pretty();
{ "_id" : ObjectId("5e5a94f82ae06a1609a00b10"), "details1" : { "details2" : { "details3" : { "10" : "John", "30" : "Mike", "40" : "David", "50" : "Chris" } } } }

Aggregation lọc các key trong khoảng 35-60:

> db.demo379.aggregate([
  { "$addFields": {
    "details1.details2.details3": {
      "$arrayToObject": {
        "$filter": {
          "input": { "$objectToArray": "$details1.details2.details3" },
          "as": "out",
          "cond": {
            "$and": [
              { "$gte": ["$$out.k", "35"] },
              { "$lte": ["$$out.k", "60"] }
            ]
          }
        }
      }
    }
  }}
])

Kết quả (chỉ giữ key 40, 50):

{ "_id" : ObjectId("5e5a94f82ae06a1609a00b10"), "details1" : { "details2" : { "details3" : { "40" : "David", "50" : "Chris" } } } }

Quy trình:

  1. $objectToArray: object → mảng [{k, v}, ...]
  2. $filter: lọc phần tử theo điều kiện key
  3. $arrayToObject: mảng → object trở lại
  4. $addFields: ghi đè trường gốc

Kỹ thuật này hữu ích khi schema động (dynamic keys) cần lọc theo điều kiện key.