繁体   English   中英

MongoDB 聚合 - 如何获取/更新总和

[英]MongoDB Aggregation - How to get/update sum

例如,我的数据库中有一些东西,比如客户集合。

{
  Max: {
    shoping_list: { 
      food: { Pizza: 2, Ramen: 1, Sushi: 5 }
    }
  },
  John: {
    shoping_list: { 
      food: { Pizza: 2, Ramen: 1, Burger: 1 }
    }
  }
}

在我的后端,我想得到食物的总和

const request = await customers.aggregate([
   {
     $group: {
       _id: null,
       Pizza: {
         $sum: '$shoping_list.food.Pizza',
   },

有没有一种方法可以自动更新或获取总和,而无需手动写入shopping_list中的每一种食物?

文档的设计可能导致查询看起来很复杂但仍然可以实现。

  1. $replaceRoot - 用新文档替换输入文档。

    1.1. $reduce - 迭代数组并将其转换为新形式(数组)。

    1.2. input - 将当前文档$$ROOT的键值对转换为对象数组,例如: [{ k: "", v: "" }]

    1.3. initialValue - 使用空数组初始化值。 这将导致数组中的 output。

    1.4. in

    1.4.1. $concatArrays - 将聚合数组结果 ( $$value ) 与1.4.2组合。

    1.4.2. 使用$cond运算符过滤掉带有{ k: "_id" }的文档,然后我们通过$objectToArray objectToArray 将当前迭代对象的v shoping_list.food转换为数组。

  2. $unwind - 将foods数组解构为多个文档。

  3. $group - 按foods.k并为foods.v

db.collection.aggregate([
  {
    $replaceRoot: {
      newRoot: {
        foods: {
          $reduce: {
            input: {
              $objectToArray: "$$ROOT"
            },
            initialValue: [],
            in: {
              $concatArrays: [
                "$$value",
                {
                  $cond: {
                    if: {
                      $ne: [
                        "$$this.k",
                        "_id"
                      ]
                    },
                    then: {
                      $objectToArray: "$$this.v.shoping_list.food"
                    },
                    else: []
                  }
                }
              ]
            }
          }
        }
      }
    }
  },
  {
    $unwind: "$foods"
  },
  {
    $group: {
      _id: "$foods.k",
      sum: {
        $sum: "$foods.v"
      }
    }
  }
])

演示 @ Mongo 游乐场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM