Sử dụng aggregation với nhiều $unwind và $match để lọc tài liệu con lồng sâu. Tạo collection phức tạp:
> db.demo583.insert([{
... "details1": [
... { "details2": [ { "isMarried": true, "Name": "Chris" }, { "isMarried": true, "Name": "Bob" } ] },
... { "details2": [ { "isMarried": false, "Name": "Chris" }, { "isMarried": true, "Name": "Mike" } ] }
... ]
... }]);
BulkWriteResult({ "nInserted" : 1 })
Hiển thị dữ liệu:
> db.demo583.find();
{ "_id" : ObjectId("5e91d3c4fd2d90c177b5bcc1"), "details1" : [ { "details2" : [ { "isMarried" : true, "Name" : "Chris" }, { "isMarried" : true, "Name" : "Bob" } ] }, { "details2" : [ { "isMarried" : false, "Name" : "Chris" }, { "isMarried" : true, "Name" : "Mike" } ] } ] }
Pipeline lọc: isMarried=true VÀ Name="Chris" ở cấp details2:
> var q = [
... { "$match": { "details1.details2.isMarried": true, "details1.details2.Name": "Chris" } },
... { "$unwind": "$details1" },
... { "$unwind": "$details1.details2" },
... { "$match": { "details1.details2.isMarried": true, "details1.details2.Name": "Chris" } }
... ];
> db.demo583.aggregate(q).pretty();
Kết quả (chỉ giữ lại subdocument khớp):
{ "_id" : ObjectId("5e91d3c4fd2d90c177b5bcc1"), "details1" : { "details2" : { "isMarried" : true, "Name" : "Chris" } } }
Quy trình:
$matchđầu: Lọc nhanh tài liệu gốc có chứa giá trị mục tiêu$unwind details1: Phân tách mảng cấp 1$unwind details2: Phân tách mảng cấp 2$matchcuối: Lọc chính xác subdocument cấp sâu nhất