簡體   English   中英

如何跨 mongodB 集合中的所有文檔聚合映射鍵?

[英]How to aggregate over map keys across all the documents in mongodB collection?

我有以下格式的數據:

[{
"OrderId": "406-5309498-5972326",
"revenueHeader": {
"Principal": 982.14,
"Product Tax": 117.86,
"Total": 1100
}},
{
"OrderId": "506-5234568-5934567",
"revenueHeader": {
"Principal": 382.54,
"Product Tax": 34.46,
"Shipping charge": 30.5,
"Giftwrap charge": 27.5,
"Total": 234
}}]

如何對所有文檔中的鍵的 RevenueHeader 映射值求和? 注意:第一個文檔中不存在“運費”,但我們仍然需要所有文檔中此密鑰的總和。 此外,密鑰可能會有所不同,無法事先知道密鑰的名稱。

您必須使用$ objectToArray 來轉換 {k,v} 對象數組中的 RevenueHeader。

然后,您可以 $unwind 數組,並按 RevenueHeader.k 進行分組,求和 RevenueHeader.v。 通過這種方式,您永遠不會關心revenueHeader 中的字段名稱或存在。

這是查詢:

db.collection.aggregate([
  {
    $project: {
      revenueHeader: {
        $objectToArray: "$revenueHeader"
      }
    }
  },
  {
    $unwind: "$revenueHeader"
  },
  {
    $group: {
      _id: "$revenueHeader.k",
      total: {
        $sum: "$revenueHeader.v"
      }
    }
  }
])

你可以在這里測試

如果您不確定要獲取跨文檔值的總和的字段有多少,那么您可以使用@matthPen 提供的解決方案。

但是,如果您知道所有可能存在的字段,那么您可以直接使用帶有鍵名的 $group 階段。 如果文檔數量非常大,我個人會避免使用 $unwind 。

[ 
    { 
        $group: { 
            _id: null,
            "Principal": { $sum: "$revenueHeader.Principal" },
            "Product Tax": { $sum: "$revenueHeader.Product Tax" },
            "Shipping charge": { $sum: "$revenueHeader.Shipping charge" },
            "Giftwrap charge": { $sum: "$revenueHeader.Giftwrap charge" },
            "Total": { $sum: "$revenueHeader.Total" },
        } 
    } 
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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