填写记录中缺失的日期

2024-04-17

我有一个收藏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 },
    // ...
]

Issue:

问题是,这个聚合不会返回{ date: '2018-09-03', views: 0 }0意见。这会导致数据显示不正确:[![在此处输入图像描述][1]][1]

结果应如下所示:

[
    { 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 },
    // ...
]

P.S.:最好传入开始和结束日期以根据此范围输出结果 [1]:https://i.stack.imgur.com/uHPBs.png https://i.stack.imgur.com/uHPBs.png


您需要几个额外的阶段来返回默认值。首先你需要使用$group with _id set to null将所有结果收集到一份文档中。然后你可以使用$map https://docs.mongodb.com/manual/reference/operator/aggregation/map/index.html以天数数组作为输入。里面那个$map您可以使用$数组索引 https://docs.mongodb.com/manual/reference/operator/aggregation/indexOfArray/index.html查找当前结果集中是否存在该日期。如果是 (index != -1) 那么你可以返回该值,否则你需要返回默认子文档views set to 0。然后你可以使用$unwind https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/index.html取回文件列表并$replaceRoot https://docs.mongodb.com/manual/reference/operator/aggregation/replaceRoot/index.html促进嵌套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 https://docs.mongodb.com/manual/reference/operator/aggregation/range/index.html)但它可能会使这个聚合管道变得复杂。如果您对此感到满意或者您想尝试在 MongoDB 中生成该日期数组,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

填写记录中缺失的日期 的相关文章

随机推荐

  • C浮点精度[重复]

    这个问题在这里已经有答案了 可能的重复 浮点比较 https stackoverflow com questions 7011184 floating point comparison 我对 C C 中浮点数的准确性有疑问 当我执行下面的程
  • 如何使用 sprintf 附加字符串?

    我面临着一个严重的问题sprintf 假设我的代码片段是 sprintf Buffer Hello World sprintf Buffer Good Morning sprintf Buffer Good Afternoon 几百次冲刺
  • 如何给计时器添加 5 秒

    我正在尝试制作一个显示以下时间的计时器 小时 分钟 秒 毫秒 这是我的代码 var timer NSTimer var startTime NSTimeInterval func updateTime var currentTime NSD
  • 当针对 Flex 4 sdk 时,Flex builder3 不会生成 html 包装器

    在 Flex builder 3 中 当我创建一个针对 Flex 4 sdk 的新 Flex 应用程序时 它不会生成 html 包装文件 我在网上寻找答案 但没有成功 我已确保在项目属性中选中该框以生成 html 包装器 唯一的解决方法是针
  • 为 Android 构建 Valgrind

    使用 ndk r6 或 ndk r8d 在 ubuntu 12 04 上构建 valgrind 3 8 1 失败 并出现以下错误 cc1 Error not rekognized option marm priv main globals
  • VSCode 调试器附加到本地进程

    PyCharm 的一大特色是它允许其调试器附加到本地运行 以及 IDE 外部 的 python 进程 当我尝试迁移到 VSCode 以在 Python 中工作时 我很难配置启动 json模拟 PyCharm 的附加到本地进程功能 name
  • 如何强制 Angular cli 从绝对位置而不是 base-href 提供包文件

    我正在努力将使用 cli 构建的 Angular 4 项目部署到 Spring boot 服务器 In the angular cli json我添加了 outdir 属性 它指向 Spring webapp 文件夹内的自定义文件夹 可以直
  • Swagger UI 嵌套可扩展分组

    我正在使用 SwaggerUI 来记录 API 端点 目前 它们按控制器名称分组在一个长列表中 然后 您可以展开每个控制器来查看操作 一切标准 我想做的是将控制器分组到常见的可扩展组下 例如 您有一个宠物组 可以将其展开以显示猫和狗控制器
  • 如何在 Listview 绑定 Xamarin.Forms 内创建网格

    如何使用数据绑定在 ListView 内创建网格 我正在使用 Xamarin Forms 创建这个应用程序 如果我不知道需要多少行和列 如何在 ListView 绑定内动态创建网格 这是我到目前为止所拥有的
  • 如何在BehaviorSubject中设置默认值

    可能是一个菜鸟问题 如何为BehaviorSubject 设置默认值 我有一个具有 2 个不同值的枚举 enum class WidgetState HIDDEN VISIBLE 以及发出状态的行为主体 val widgetStateEmi
  • 使用 JMockit 模拟私有静态字段?

    我有一个像下面这样的课程 class ClassA private static File myDir myDir is created at some stage private static String findFile final
  • 预编译 JavaScript 模板以在项目构建时发挥作用

    Update我想避免在客户端编译模板 并在本地 ant 构建过程中编译它们 也许像将 jQuery 和 jQuery 模板加载到 rhino 中 传递 template 依次处理每个 jst 文件的内容 并构建一个 templates js
  • GNU Make 获取父目标名称

    在gnu make中 有没有办法获取启动整个链的原始目标并将执行引导到当前配方 PHONY all clean common all common clean common common echo echo MAKECMDGOALS for
  • PreparedStatement缓存——它是什么意思(它是如何工作的)

    例如 我使用 c3p0 和一些定义的 maxStatements 来进行准备语句缓存 这个缓存到底有什么作用 它缓存什么样的数据 在什么级别 数据库 应用程序 从例子中理解它会很好 例如我有一个查询 从某个表中选择 其中某个列 现在我在未缓
  • 来自 bash 脚本的电子邮件

    bin bash MESSAGE Line one n MESSAGE MESSAGE Line two n MESSAGE MESSAGE Line three echo MESSAGE mail s test email protect
  • 进入编辑模式时保持 UITableViewCell 背景颜色

    我已经为所有 UITableViewCell 设置了背景颜色 但是 当我单击 UIBarButtonItem 编辑 时 删除和可拖动图标会扭曲背景颜色 使其后面出现白色背景 有没有办法解决 如有必要 我可以显示代码 但这似乎是一个非常简单的
  • 从 .xbindkeysrc 执行命令后退出终端

    我正在尝试使用 xbindkeysrc 将命令绑定到密钥 即该命令从 keepassxc 检索密码 并将其作为标准输入回显到 openconnect 用于 VPN 连接 命令 最后关闭终端 以下内容完成了所有这些工作 并且有效 psswd
  • 错误域=AVFoundationErrorDomain代码=-11800“操作无法完成。错误域=NSOSStatusErrorDomain代码=-16170“(空)”

    我在聊天应用程序中使用 AVPlayer 但在选定的音频文件中遇到以下错误 但音频文件在浏览器中正确播放 错误域 AVFoundationErrorDomain代码 11800 该操作可以 未完成 UserInfo NSUnderlying
  • iOS - UIProgressView 仅更新一次

    我正在从 API 加载数据 并使用 UIProgressView 来显示已加载的数据量 在我看来 WillAppear 我使用 Reachability 来检查是否有互联网连接 然后 如果存在 则在函数中调用以下行 10 次 self pe
  • 填写记录中缺失的日期

    我有一个收藏ProductViews productId 5b8c0f3204a10228b00a1745 createdAt 2018 09 07T17 18 40 759Z 我有一个查询 用于获取特定产品的每日视图 ProductVie