ใช้ $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" } ] } ] } }