首页 > 解决方案 > 如何在 MongoDB 中标记字段并根据日期求和

问题描述

需要格式化日期并每天计算总和,但有时ab值不可用。最后,得到一份关于日期和总和的文件。我正在使用 MongoDB 4.2。

Data Structure:
{
  "data": {
    "11-10-2001": {
      "a": 17.281150000000001,
      "b": 11.864060000000006
    },
    "13-10-2020": {
      "b": 2.7616699999999994
    },
    "12-10-2001": {
      "b": 4.0809599999999997
    },
    "09-10-2001": {
      "b": 4.1286300000000005
    },
    "17-10-2001": {
      "a": 15.140560000000123,
      "b": 5.017139999999998
    },
    "18-10-2001": {
      "b": 1.975189999999997,
      "a": 7.093789999999976
    }
  }
}

预期输出一个包含日期和总和的文档:

{
  {
    day: 11-10-2001,
    sum : 29.145
  },
  {
    day: 13-10-201,
    sum : 2.7616699
  },
  {
    day: 12-10-2001,
    sum  : 4.0809599999999997
  },
  {
    day: 17-10-2001,
    sum  : 20.114
  },
  {
    day: 18-10-2001,
    sum  : 9.145
  }
}

标签: mongodbmongoosemongodb-queryaggregation-framework

解决方案


你可以试试,

  • $mapdata使用转换为数组后迭代对象循环$objectToArray
  • 使用,转换为数组后,将 keydaysum,添加$reduce到 number 对象的循环中,以求和number 的值$objectToArray$add
  • $unwind解构数据数组
  • $replaceRootdata对象替换为根
db.collection.aggregate([
  {
    $addFields: {
      data: {
        $map: {
          input: { $objectToArray: "$data" },
          in: {
            day: "$$this.k",
            sum: {
              $reduce: {
                input: { $objectToArray: "$$this.v" },
                initialValue: 0,
                in: { $add: ["$$this.v", "$$value"] }
              }
            }
          }
        }
      }
    }
  },
  { $unwind: "$data" },
  { $replaceRoot: { newRoot: "$data" } }
])

操场


推荐阅读