我有反轉物件鍵和值的要求。我有以下型別的資料:
[
"elements": {
"title": "elem_1_6_title",
"sub_title": "elem_1_6_sub_title",
"media": "elem_1_6_media",
"button": "elem_1_6_button",
"give_us_call": "elem_1_6_give_us_call"
},
"elements": {
"title": "elem_1_6_title",
"sub_title": "elem_1_6_sub_title"
},
"elements": {}
]
預期輸出:
[
"elements": {
"elem_1_6_title": "title",
"elem_1_6_sub_title": "sub_title",
"elem_1_6_media": "media",
"elem_1_6_button": "button",
"elem_1_6_give_us_call": "give_us_call"
},
"elements": {
"elem_1_6_title": "title",
"elem_1_6_sub_title": "sub_title"
},
"elements": {}
]
管道:
[
{
"$addFields": {
"sec_elems_arr": {
"$objectToArray": "$elements"
}
}
},
{
"$unwind": {
"path": "$sec_elems_arr",
"preserveNullAndEmptyArrays": true
}
},
{
"$addFields": {
"section_elements": {
"$arrayToObject": [
[
{
"k": "$sec_elems_arr.v",
"v": "$sec_elems_arr.k"
}
]
]
}
}
}
]
上面的管道拋出錯誤:
$arrayToObject requires an object keys of 'k' and 'v'. Found incorrect number of keys:0
因為上述元素物件之一沒有鍵值。但是這種情況可以存在于資料中。如何使用 MongoDB 聚合管道來實作這一點?
uj5u.com熱心網友回復:
我認為問題更多在于您使用$arrayToObject不正確。您可以使用它$map來正確交換 kv。
db.collection.aggregate([
{
$addFields: {
elements: {
"$objectToArray": "$elements"
}
}
},
{
"$addFields": {
"elements": {
"$arrayToObject": {
"$map": {
"input": "$elements",
"as": "e",
"in": {
k: "$$e.v",
v: "$$e.k"
}
}
}
}
}
}
])
這是Mongo游樂場供您參考。
uj5u.com熱心網友回復:
請注意,上面的答案可以通過呼叫$objectToArray作為 的輸入來進一步優化$map。這節省了一個階段——總是一件好事。
db.collection.aggregate([
{
"$addFields": {
"elements": {
"$arrayToObject": {
"$map": {
"input": {"$objectToArray": "$elements"},
"as": "e",
"in": {
k: "$$e.v",
v: "$$e.k"
}
}
}
}
}
}
])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/467809.html
上一篇:重繪后資料未定義
