在 mongodb 聚合中添加缺少序列日期的文档

问题描述 投票:0回答:1

这里看到这个Collection here有一条带有createdAt14Feb的记录和一个带有16Feb的记录,现在查询集合上的聚合,例如我想添加15Feb的文档,因为它在集合中丢失viewCountclickCount 为 0。

因此寻找某种方法在聚合管道中添加丢失的日期记录/文档。

我有管道

          [
            {
              $group: {
                _id: {
                  $dateToString: { format: "%Y-%m-%d", date: "$createdAt" },
                },
                viewCount: { $sum: "$viewCount" },
                clickCount: { $sum: "$clickCount" },
              },
            },
            { $sort: { _id: 1 } },
            {
              $group: {
                _id: null,
                data: {
                  $push: {
                    k: "$_id",
                    v: { viewCount: "$viewCount", clickCount: "$clickCount" },
                  },
                },
              },
            },
            {
              $project: {
                _id: 0,
                data: { $arrayToObject: "$data" },
              },
            },
          ]```

I looking for some operator in mongo or some way to do this
mongodb aggregation-framework aggregate aggregation
1个回答
0
投票

您可以使用

$densify
$fill
阶段来填补数据中的空白。作为示例,我已将您的管道更改为不按字符串分组,而是使用
$dateTrunc
来剪切当天之后的日期,因此您可以按天分组,但仍然使用
ISODate
以便之后更容易进行插值。

请注意,此示例管道仅包含管道的第一个阶段,可以作为起点。为了展示如何填写缺失值,我已经停止了:

[
  {
    $group: {
      _id: {
        $dateTrunc: {
          date: "$createdAt",
          unit: "day"
        }
      },
      viewCount: {
        $sum: "$viewCount"
      },
      clickCount: {
        $sum: "$clickCount"
      }
    }
  },
  {
    $sort: {
      _id: 1
    }
  },
  {
    $densify: {
      field: "_id",
      range: {
        step: 1,
        bounds: "full",
        unit: "day"
      }
    }
  },
  {
    $fill: {
      output: {
        viewCount: {
          value: 0
        },
        clickCount: {
          value: 0
        }
      }
    }
  }
]

使用这个mongoplayground来测试。

© www.soinside.com 2019 - 2024. All rights reserved.