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

การตั้งค่าเงื่อนไขกรองข้อมูลสำหรับอาร์เรย์ซ้อนกันใน MongoDB

ใช้ $filter และ $cond ใน Aggregate Pipeline

$filter ใช้เลือกส่วนย่อยของอาร์เรย์ตามเงื่อนไขที่กำหนด สามารถรวมกับ $cond เพื่อสร้างเงื่อนไขซับซ้อนได้

สร้างข้อมูลตัวอย่างที่มีอาร์เรย์ซ้อน 3 ระดับ

> db.demo725.insertOne({
    "details": {
        "userMessages": [
            { "Messages": [ { "Message": "Hello" }, { "Message": "How" }, { "Message": "are" } ] },
            { "Messages": [ { "Message": "Good" }, { "Message": "Bye" } ] },
            { "Messages": [ { "Message": "Hello" }, { "Message": "Bye" } ] }
        ]
    }
});

แสดงข้อมูลทั้งหมด

> db.demo725.find();

ผลลัพธ์:

{ "_id" : ObjectId("5eab16cd43417811278f5893"), "details" : { "userMessages" : [ { "Messages" : [ { "Message" : "Hello" }, { "Message" : "How" }, { "Message" : "are" } ] }, { "Messages" : [ { "Message" : "Good" }, { "Message" : "Bye" } ] }, { "Messages" : [ { "Message" : "Hello" }, { "Message" : "Bye" } ] } ] } }

คิวรีกรองเฉพาะอิลิเมนต์ที่มีคำว่า "Hello"

> db.demo725.aggregate([
    {
        $addFields: {
            "details.userMessages": {
                $filter: {
                    input: "$details.userMessages",
                    as: "out",
                    cond: {
                        $anyElementTrue: {
                            $map: {
                                input: "$$out.Messages",
                                in: { $gte: [ { $indexOfBytes: [ "$$this.Message", "Hello" ] }, 0 ] }
                            }
                        }
                    }
                }
            }
        }
    }
]).pretty()

ผลลัพธ์: เหลือเฉพาะอิลิเมนต์ที่มี "Hello"

{ "_id" : ObjectId("5eab16cd43417811278f5893"), "details" : { "userMessages" : [ { "Messages" : [ { "Message" : "Hello" }, { "Message" : "How" }, { "Message" : "are" } ] }, { "Messages" : [ { "Message" : "Hello" }, { "Message" : "Bye" } ] } ] } }