[英]Using MergeObjects without overwriting subdocuments
我正在嘗試合並聚合管道中的兩個字段。
我想改變這個:
{
"a": 1,
"b": {
"first": {
"property_a": "some_value",
"property_b": "some_value",
"property_c": "some_value"
},
"second": {
"property_a": "some_value",
"property_b": "some_value",
"property_c": "some_value"
},
"third": {
"property_a": "some_value",
"property_b": "some_value",
"property_c": "some_value"
},
"fiftieth": {
"property_a": "some_value",
"property_b": "some_value",
"property_c": "some_value"
}
},
"c": {
"first": {
"property_x": "some_value",
"property_y": "some_value"
},
"second": {
"property_x": "some_value",
"property_y": "some_value"
},
"fiftieth": {
"property_x": "some_value",
"property_y": "some_value"
}
}
}
對此,無需指定“b”下列出的每個鍵:
{
"a": 1,
"b": {
"first": {
"property_a": "some_value",
"property_b": "some_value",
"property_c": "some_value",
"property_x": "some_value",
"property_y": "some_value"
},
"second": {
"property_a": "some_value",
"property_b": "some_value",
"property_c": "some_value",
"property_x": "some_value",
"property_y": "some_value"
},
"third": {
"property_a": "some_value",
"property_b": "some_value",
"property_c": "some_value"
},
"fiftieth": {
"property_a": "some_value",
"property_b": "some_value",
"property_c": "some_value",
"property_x": "some_value",
"property_y": "some_value"
}
}
}
在mergeObjects
的文檔中,它指出:
mergeObjects 在合並文檔時會覆蓋字段值。 如果要合並的文檔包含相同的字段名稱,則結果文檔中的字段具有為該字段合並的最后一個文檔的值。
如何在不指定每個鍵的情況下合並字段 b 和 c 的子文檔(我的真實用例中有 85 個鍵)。 此外,字段 c 可能沒有 b 下列出的每個鍵。 或者這是不可能的?
您可以使用$objectToArray
將對象轉換為 k,v 對,組合和$unwind
它們,通過鍵名$group
並合並文檔,然后通過 _id 使用$group
將鍵收集在一起。
db.collection.aggregate([
{$addFields: {
combined: {
$concatArrays: [
{$objectToArray: "$b"},
{$objectToArray: "$c"}
]
}
}},
{$unwind: "$combined"},
{$group: {
_id: {_id: "$_id", key: "$combined.k"},
doc: {$first: "$$ROOT"},
v: {$mergeObjects: "$combined.v"}
}},
{$group: {
_id: "$_id._id",
doc: {$first: "$doc"},
combined: {$push: {
k: "$_id.key",
v: "$v"
}}
}},
{$addFields: {"doc.b": {$arrayToObject: "$combined"}}},
{$project: {
combined: 0,
"doc.c": 0
}},
{$replaceRoot: {newRoot: "$doc"}}
])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.