在MongoDB聚合中添加缺失日期

tbhaxor

在这个问题中,我想获得以下时间范围内的用户订阅

  • 今天
  • 本星期
  • 这个月
  • 今年

对于此时间范围,我想显示$group所有可能的日期。

[
  { Dates: '2020-05-21', Count: 3, AverageIncome: 30 },
  { Dates: '2020-05-22', Count: 10, AverageIncome: 30 },
  { Dates: '2020-05-24', Count: 1, AverageIncome: 37 },
  { Dates: '2020-05-25', Count: 1, AverageIncome: 30 },
  { Dates: '2020-05-26', Count: 2, AverageIncome: 65 }
]

我也想添加缺少的日期,并将累加器数据设置为0。例如,它应该是

[
  { Dates: '2020-05-21', Count: 3, AverageIncome: 30 },
  { Dates: '2020-05-22', Count: 10, AverageIncome: 30 },
  { Dates: '2020-05-23', Count: 0, AverageIncome: 0 },
  { Dates: '2020-05-24', Count: 1, AverageIncome: 37 },
  { Dates: '2020-05-25', Count: 1, AverageIncome: 30 },
  { Dates: '2020-05-26', Count: 2, AverageIncome: 65 },
  { Dates: '2020-05-27', Count: 0, AverageIncome: 0 },
  { Dates: '2020-05-28', Count: 2, AverageIncome: 0 },
]

PS:此时UTC时间为5月28日晚上11:45

我正在使用的聚合管道阶段

const $agg = await Subscription.aggregate([
    {
      $match: {
        createdOn: {
          $gte: moment(req.query.from).toDate(),
          $lte: moment(req.query.to).toDate()
        },
        isCancelled: false
      }
    },

    {
      $group: {
        _id: {
          $dateToString: {
            format: "%Y-%m-%d",
            date: "$createdOn"
          }
        },
        count: { $sum: 1 },
        avgAmount: { $avg: "$amountPaid" }
      }
    },
    {
      $project: {
        _id: false,
        sortKey: {
          $dateFromString: {
            dateString: "$_id"
          }
        },
        Dates: "$_id",
        Count: "$count",
        AverageIncome: "$avgAmount"
      }
    },
    {
      $sort: {
        sortKey: 1
      }
    },
    {
      $project: {
        sortKey: false
      }
    }
  ]);
钦丹·帕兰

一段时间以前,我曾遇到过类似的问题,这是我遵循的方法:

function fillEmptyDates($agg, $defaultData, from, to) {
  const $aggObj = {}; //Taking this as an object for easy checking

  $agg.map((agg) => {
    $aggObj[agg.Date] = agg; //Making an object from array entries with Date as key
  });

  const $loopDate = moment(from);
  const $endDate = moment(to);

  //Starting from from date to to date, checking if any date does not have entry in $aggObje
  while ($endDate.isSameOrAfter($loopDate)) {
    let $aggDate = $loopDate.format("YYYY-MM-DD");

    if (!$aggObj.hasOwnProperty($aggDate)) {
      //If any date does not have entry, creating a new entry from default aggregates and giving it the date as current date
      $aggObj[$aggDate] = {
        ...$defaultData,
        Date: $aggDate
      };
    }
    $loopDate.add(1, "day"); //Incrementing aggregate date
  }

  //Converting back to array and sorting by date
  return Object.values($aggObj).sort((a, b) =>
    moment(a.Date).isBefore(moment(b.Date)) ? -1 : 1
  );
};

//You can call this function like so
$agg = fillEmptyDates(
            $agg, 
            { Count: 0, AverageIncome: 0 },
            req.query.from,
            req.query.to,
        )

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MongoDB聚合可在按日期字段分组后在两个日期之间添加缺失的月份

Mongodb-在聚合方法中添加日期范围条件

如何在熊猫中添加缺失的日期

使用 Spring MongoDB 创建聚合查询 | 将小时数添加到投影中的日期

按日期和组聚合并在大查询中填写缺失的日期

在多索引数据框中添加缺失日期索引

将缺失的日期添加到dt系列的Multiindex中

为 R 中的日期范围添加缺失的月份

在 Python 中添加数量为 0 的缺失日期

mongodb-日期比较在聚合中不起作用

在MongoDB中查找一系列日期中的缺失日期

如何在熊猫中使用正确的日期格式将缺失的日期添加到索引中?

如何在给定的开始日期和结束日期之间的数组中添加缺失的数据条目

填写记录中的缺失日期

在行中插入缺失的日期

参考Tableau中的缺失日期

向MongoDB聚合中的對象添加動態鍵

Prisma 与 MongoDB 中的逻辑 OR 缺失

在从 Excel 导入数据期间在 MYSQL 数据库中添加缺失日期

将缺失的数据添加到按日期分组的数据框中

为 PostgreSQL 中按日期设置的唯一组添加缺失的行

從列中提取日期並在 R 中缺失時添加年份

使用最后一个值在 Pandas 中添加缺失的日期做 datetime 列

mongodb 按日期范围聚合,用以前文档中的数据填充空白日期

mongodb中的聚合函数

mongodb聚合中的$ replaceRoot

在mongodb中与$ sum聚合

$或mongodb 3.4中的聚合

聚合MongoDB中的数组