-
$arrayElemAt
để lấy phần tử đầu tiên từ dic
mảng
-
$objectToArray
chuyển đổi A
đối tượng với mảng
-
$reduce
để lặp lại vòng lặp của phần tử bên trên mảng đã chuyển đổi và kiểm tra điều kiện nếu _id.A
khớp với dữ liệu A
sau đó trả về trường cụ thể,
- thực hiện quy trình tương tự cho
B
và C
db.collection.aggregate([
{
$addFields: {
dic: { $arrayElemAt: ["$dic", 0] }
}
},
{
$project: {
_id: 1,
dic: {
A: {
$reduce: {
input: { $objectToArray: "$dic.data.A" },
initialValue: "Not Found",
in: {
$cond: [
{ $eq: ["$$this.k", "$_id.A"] },
"$$this.v.name",
"$$value"
]
}
}
},
B: {
$reduce: {
input: { $objectToArray: "$dic.data.B" },
initialValue: "Not Found",
in: {
$cond: [
{ $eq: ["$$this.k", "$_id.B"] },
"$$this.v.description",
"$$value"
]
}
}
},
C: {
$reduce: {
input: { $objectToArray: "$dic.data.C" },
initialValue: "Not Found",
in: {
$cond: [
{ $eq: ["$$this.k", "$_id.C"] },
"$$this.v.description",
"$$value"
]
}
}
}
}
}
}
])
Sân chơi