Từ MongoDB 3.4.4 trở lên, bạn có thể sử dụng $arrayToObject
toán tử chuyển một mảng thành một tài liệu duy nhất và mảng phải là một danh sách các tài liệu chứa hai trường, k
và v
ở đâu:
Vì vậy, bạn sẽ cần tạo một đường dẫn để chuyển đổi items
trước tiên mảng từ
"items":[
{
"id":"AB-02",
"qty":2
},
{
"id":"AB-03",
"qty":0
},
{
"id":"AB-03",
"qty":9
}
]
đến
"items" : [
{
"k" : "AB-02",
"v" : {
"id" : "AB-02",
"qty" : 2.0
}
},
{
"k" : "AB-03",
"v" : {
"id" : "AB-03",
"qty" : 0.0
}
},
{
"k" : "AB-03",
"v" : {
"id" : "AB-03",
"qty" : 9.0
}
}
]
$map
thực hiện điều đó một cách chính xác với biểu thức
"$map": {
"input": "$items",
"as": "item",
"in": {
"k": "$$item.id",
"v": "$$item"
}
}
Vì vậy, đường dẫn cuối cùng của bạn có thể bao gồm tất cả các toán tử ở trên vào một giai đoạn duy nhất với $addFields
như:
db.collection.aggregate([
{
"$addFields": {
"items": {
"$arrayToObject": {
"$map": {
"input": "$items",
"as": "item",
"in": {
"k": "$$item.id",
"v": "$$item"
}
}
}
}
}
}
])