ในการตั้งค่าเงื่อนไขการกรอง ให้ใช้ $filter และ $cond ใน MongoDB aggregate() ตัวกรอง $ จะเลือกชุดย่อยของอาร์เรย์ที่จะส่งคืนตามเงื่อนไขที่ระบุ ให้เราสร้างคอลเลกชันที่มีเอกสาร -
> db.demo725.insertOne(
... {
...
... "details": {
...
... "userMessages": [
... {
... "Messages": [
... { "Message": "Hello" },
... { "Message": "How" },
... { "Message": "are" }
... ]
...
... },
... {
... "Messages": [
... { "Message": "Good" },
... { "Message": "Bye" }
...
... ]
... },
... {
... "Messages": [
... { "Message": "Hello" },
... { "Message": "Bye" }
...
... ]
...
... }
... ]
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5eab16cd43417811278f5893")
} แสดงเอกสารทั้งหมดจากคอลเล็กชันโดยใช้วิธี find() -
> 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" } ] } ] } } ต่อไปนี้เป็นแบบสอบถามเพื่อกำหนดเงื่อนไขการกรองสำหรับอาร์เรย์ที่ซ้อนกัน -
> 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() สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -
{
"_id" : ObjectId("5eab16cd43417811278f5893"),
"details" : {
"userMessages" : [
{
"Messages" : [
{
"Message" : "Hello"
},
{
"Message" : "How"
},
{
"Message" : "are"
}
]
},
{
"Messages" : [
{
"Message" : "Hello"
},
{
"Message" : "Bye"
}
]
}
]
}
}