Sử dụng $filter và $cond trong Aggregation
Toán tử $filter chọn một tập con của mảng dựa trên điều kiện. Kết hợp với $map và $anyElementTrue để lọc mảng lồng nhau phức tạp.
Dữ liệu mẫu (3 cấp lồng nhau)
> db.demo725.insertOne({
details: {
userMessages: [
{ Messages: [ { Message: "Hello" }, { Message: "How" }, { Message: "are" } ] },
{ Messages: [ { Message: "Good" }, { Message: "Bye" } ] },
{ Messages: [ { Message: "Hello" }, { Message: "Bye" } ] }
]
}
});
Truy vấn lọc: giữ lại các nhóm Messages chứa "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()
Kết quả
{
"_id": ObjectId("5eab16cd43417811278f5893"),
"details": {
"userMessages": [
{ "Messages": [ { "Message": "Hello" }, { "Message": "How" }, { "Message": "are" } ] },
{ "Messages": [ { "Message": "Hello" }, { "Message": "Bye" } ] }
]
}
}
Chỉ các phần tử mảng chứa tin nhắn "Hello" được giữ lại.