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

Aggregation MongoDB cho tài liệu lồng nhau sâu

Để aggregation trên tài liệu lồng nhau sâu, sử dụng aggregate() với $unwind và $group. Tạo collection:

> db.demo199.insertOne({
   "details1": {
      "details2": {
         "details3": {
            "Name": "Chris",
            "details4": {
               "details5": { "v1": 10, "v2": 20, "v3": 30 }
            }
         }
      }
   }
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3c24aa03d395bdc21346e2") }
> db.demo199.insertOne({
   "details1": {
      "details2": {
         "details3": {
            "Name": "Chris",
            "details4": {
               "details5": { "v1": 30, "v2": 40, "v3": 50 }
            }
         }
      }
   }
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3c24ab03d395bdc21346e3") }

Hiển thị tài liệu:

> db.demo199.find();

Kết quả - cấu trúc lồng nhau 5 cấp:

Aggregation tính tổng các trường v1, v2, v3 qua tất cả tài liệu:

> var out = [
   { "$unwind": "$details1.details2" },
   { "$group": {
      "_id": "$details1.details2._id",
      "v1": { "$sum": "$details1.details2.details3.details4.details5.v1" },
      "v2": { "$sum": "$details1.details2.details3.details4.details5.v2" },
      "v3": { "$sum": "$details1.details2.details3.details4.details5.v3" }
   }}
]
> result = db.demo199.aggregate(out);

Kết quả tổng hợp:

Lưu ý: Đường dẫn trường rất dài do cấu trúc lồng nhau sâu. Trong thực tế, nên thiết kế schema phẳng hơn để dễ truy vấn.