簡體   English   中英

使用 MergeObjects 而不覆蓋子文檔

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM