Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

การกรองซับเอกสาร (Sub-documents) ด้วยซับเอกสารใน MongoDB


สำหรับกรณีนี้ ให้ใช้ aggregate() ร่วมกับ $unwind มาสร้างคอลเล็กชันกันเถอะ

> db.demo583.insert([
    {
        "details1" : [
            {
                "details2" : [
                    {
                        "isMarried" : true,
                        "Name" : "Chris"
                    },
                    {
                        "isMarried" : true,
                        "Name" : "Bob"
                    }
                ]
            },
            {
                "details2" : [
                    {
                        "isMarried" : false,
                        "Name" : "Chris"
                    },
                    {
                        "isMarried" : true,
                        "Name" : "Mike"
                    }
                ]
            }
        ]
    }
]);
BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 1, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ] })

แสดงเอกสารทั้งหมดด้วยเมธอด find()

> 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" } ] } ] }

คำสั่งกรองซับเอกสารด้วยซับเอกสาร (isMarried=true และ Name=Chris)

> 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();

ผลลัพธ์ที่ได้

{ "_id" : ObjectId("5e91d3c4fd2d90c177b5bcc1"), "details1" : { "details2" : { "isMarried" : true, "Name" : "Chris" } } }