当前位置: 首页 > 面试题库 >

填写记录中的缺失日期

须旭
2023-03-14
问题内容

我有一个收藏ProductViews

产品浏览

{
    productId: '5b8c0f3204a10228b00a1745,
    createdAt: '2018-09-07T17:18:40.759Z',
}

我有一个查询,用于获取特定产品的每日视图。

询问

ProductView.aggregate([
    { $match: { productId } },
    { $project: { day: { $substr: ["$createdAt", 0, 10] } } },
    {
        $group: {
            _id: "$day",
            count: { $sum: 1 },
            time: { $avg: "$createdAt" },
        }
    },
    { $sort: { _id: 1 } },
    {
        $project: {
            date: '$_id',
            views: '$count',
        },
    },
]).exec((err, result) => ...)

当前结果

[
    { date: '2018-09-01', views: 1 },
    { date: '2018-09-02', views: 3 },
    { date: '2018-09-04', views: 2 },
    { date: '2018-09-05', views: 5 },
    // ...
]

问题

问题是,这种聚合不会{ date: '2018-09-03', views: 0 }在有0视图的几天内返回。这会导致数据显示不正确:在此处输入图片说明

结果应该看起来像

[
    { date: '2018-09-01', views: 1 },
    { date: '2018-09-02', views: 3 },
    { date: '2018-09-03', views: 0 },
    { date: '2018-09-04', views: 2 },
    { date: '2018-09-05', views: 5 },
    // ...
]

PS:最好输入开始和结束日期以基于此范围输出结果


问题答案:

您需要几个额外的步骤来返回默认值。首先,你需要使用$group_id设置为null收集所有结果中的一个文件内。然后,您可以将$
map
与一组天作为输入。在其中,$map您可以使用$
indexOfArray
查找当前结果集中是否存在该日期。如果是(index != -1),则可以返回该值,否则需要返回默认子文档,views并将其设置为0。然后,您可以使用$
unwind
来获取文档列表,并使用$
replaceRoot来将嵌套提升stats到顶层。

ProductView.aggregate([
    { $match: { productId: '5b8c0f3204a10228b00a1745' } },
    { $project: { day: { $substr: ["$createdAt", 0, 10] } } },
    {
        $group: {
            _id: "$day",
            count: { $sum: 1 },
            time: { $avg: "$createdAt" },
        }
    },
    { $sort: { _id: 1 } },
    {
        $project: {
            date: '$_id',
            views: '$count',
        },
    },
    {
        $group: {
            _id: null,
            stats: { $push: "$$ROOT" }
        }
    },
    {
        $project: {
            stats: {
                $map: {
                    input: [ "2018-09-01", "2018-09-02", "2018-09-03", "2018-09-04", "2018-09-05" ],
                    as: "date",
                    in: {
                        $let: {
                            vars: { dateIndex: { "$indexOfArray": [ "$stats._id", "$$date" ] } },
                            in: { 
                                $cond: {
                                    if: { $ne: [ "$$dateIndex", -1 ] },
                                    then: { $arrayElemAt: [ "$stats", "$$dateIndex" ] },
                                    else: { _id: "$$date", date: "$$date", views: 0 }
                                } 
                            }
                        }
                    }
                }
            }
        }
    },
    {
        $unwind: "$stats"
    },
    {
        $replaceRoot: {
            newRoot: "$stats"
        }
    }
]).exec((err, result) => ...)

您可以使用简单循环在应用程序逻辑中生成静态日期列表。我相信在MongoDB中也可以(使用$
range),但这可能会使此聚合管道复杂化。让我知道您是否满意,或者想尝试在MongoDB中生成该日期数组。



 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : MySQL如何填充范围内的缺失日期? (5个答案) 2年前关闭。 我有这个查询,我想用一些值(例如零…)填充缺失的日期。 结果如下: 如何用零值填充缺失的日期?有人有主意吗? 我需要这些数据来进行 图表 预览。 问题答案: 通常,您可以使用以下方法在MySQL中生成一系列N个整数: 请注意,您联接的表(someTable)必须至少具有N行。 上面的-1是

  • 问题内容: 我有一个数据框架,如下所示 我想做的是在date列中找到最小和最大日期,并扩展该列使其具有所有日期,同时为该列填写。所以所需的输出是 问题答案: 初始数据框: 首先,将日期转换为日期时间: 然后,生成日期和唯一用户: 这将允许您创建一个MultiIndex: 您可以使用它来重新索引您的DataFrame: 然后可以按用户排序:

  • 问题内容: 我想知道如何使用循环根据sql中各组的开始/结束日期来填充零值缺失日期,以便每个组中都有连续的时间序列。我有两个问题。 如何为每个组循环播放? 如何使用每个组的开始/结束日期来动态填写缺少的日期? 我的输入和预期输出如下所示。 输入: 我有一张表A喜欢 我还有一张表B,可用于与A左联接以填写缺少的日期。 如何使用A和B在sql中生成以下输出? 输出: 请给我您的代码和建议。提前非常感谢

  • 问题内容: 我有一个包含2列的表格,日期和分数。它最多有30个条目,最近30天内每个条目一个。 我的问题是缺少某些日期-我想看看: 我从单个查询中需要得到的是:19,21,9,14,0,0,10,0,0,14 …这意味着缺失的日期填充有0。 我知道如何获取所有值,以及如何使用服务器端语言遍历日期和缺少空格。但这是否可以在mysql中完成,所以我可以按日期对结果进行排序并得到缺失的片段。 编辑:在此

  • 问题内容: 我有一个MySQL查询问题,该查询按工作日将表中的数据分组。 我需要它来填充数据中缺少的工作日,例如下面的SQL示例中的星期日(工作日7)。 SQL小提琴 MySQL 5.6模式设置 : 查询1 : 结果 : 我希望它也返回此行。 我的完整查询非常复杂,因此希望您能找到一个快速的解决方案。 问题答案: 正常方法是:

  • 我正在尝试通过使用spring-cloud d-gcp-starter-log将SpringBootApplication(微服务)与StackdriverLogging集成。我能够在GCP中看到日志,但在日志中traceId和SPANId丢失。为此,我也尝试使用Spring-cloud d-sleuth,但由于我在我的微服务中使用apache kafka,因此侦探无法正常工作。有人能帮我吗我如何