MongoDB 汇总之前所有周的每周总和

2024-01-10

我有一系列 MongoDB 文档。一个示例文档是

{ 
  createdAt: Mon Oct 12 2015 09:45:20 GMT-0700 (PDT),
  year: 2015,
  week: 41 
}

想象一下这些跨越一年中的所有几周,并且同一周可能有很多。我想以这样的方式聚合它们,使得结果值是每周和所有之前几周的总文档数的总和。

因此,如果一年的第一周有 10 个,第二周有 20 个,结果可能是这样的

[{ week: 1, total: 10, weekTotal: 10},
 { week: 2, total: 30, weekTotal: 20}]

创建一个聚合来查找 weekTotal 非常简单。包括显示第一部分的投影

db.collection.aggregate([
  {
    $project: {
      "createdAt": 1,
      year: {$year: "$createdAt"},
      week: {$week: "$createdAt"},
      _id: 0
    }
  },
  {
    $group: {
      _id: {year: "$year", week: "$week"},
      weekTotal : { $sum : 1 }
    }
  },
]);

但事实证明,根据该周和之前几周的情况来总结这一点是很棘手的。


聚合框架无法做到这一点,因为所有操作一次只能有效地查看一个文档或分组边界。为了在“服务器”上执行此操作,您需要能够访问全局变量的东西来保持“运行总计”,这意味着mapReduce反而:

db.collection.mapReduce(
    function() {

        Date.prototype.getWeekNumber = function(){
            var d = new Date(+this);
            d.setHours(0,0,0);
            d.setDate(d.getDate()+4-(d.getDay()||7));
            return Math.ceil((((d-new Date(d.getFullYear(),0,1))/8.64e7)+1)/7);
        };


        emit({ year: this.createdAt.getFullYear(), week: this.createdAt.getWeekNumber() }, 1);
    },
    function(values) {
        return Array.sum(values);
    },
    { 
        out: { inline: 1 },
        scope: { total: 0 },
        finalize: function(value) {
            total += value;
            return { total: total, weekTotal: value }
        }
    }
)

如果您可以接受“客户端”上发生的操作,那么您需要循环遍历聚合结果并类似地总结总数:

var total = 0;

db.collection.aggregate([
    { "$group": {
        "_id": {
            "year": { "$year": "$createdAt" },
            "week": { "$week": "$createdAt" }
        },
        "weekTotal": { "$sum": 1 }
    }},
    { "$sort": { "_id": 1 } }
]).map(function(doc) {
    total += doc.weekTotal;
    doc.total = total;
    return doc;
});

这完全取决于您认为这是否需要在服务器上或客户端上进行最有意义。但由于聚合管道没有这样的“全局变量”,因此您可能不应该在不输出到另一个集合的情况下查看它以进行任何进一步的处理。

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

MongoDB 汇总之前所有周的每周总和 的相关文章

随机推荐

  • R 将矩阵的行乘以向量的行的最快方法

    我想将矩阵的行乘以向量的每一行 元素 而不是整个向量 正如已经发布的另一个问题所讨论的那样 例如 我想使用这两个矩阵 或者 oo 是一个向量 因为它是一列 oo matrix 1 3 3 1 oop matrix 1 9 3 3 byrow
  • 如何检查滚动条是否可见?

    是否可以检查overflow auto一个 div 的 例如 HTML div style width 100px height 100px class my class content div JQUERY my class live h
  • bash 使用正则表达式查找不区分大小写

    我需要查找以三个小写字母开头的文件 但由于某种原因 我遇到了不希望的不区分大小写的行为 我将 find 与 regex 选项一起使用 但它甚至找到以大写字母开头的文件 find regextype posix egrep regex a z
  • JSON 与 XML 的性能注意事项

    我正在使用一个 Web 服务 它提供 XML 或 JSON 格式的大型结果集 哪种格式会更快或更好 基于性能 另外我应该使用哪种语言来解析 XML JSON 我应该使用 PHP 还是 JavaScript PHP 或 JavaScript
  • Android - Facebook 共享内容被覆盖

    这是我在 Facebook 上分享高分的代码 ShareLinkContent content new ShareLinkContent Builder setImageUrl Uri parse http www example com
  • 获取 Today-Extension 内通知中心的宽度

    我目前正在尝试将 CollectionView 放入 Today 扩展中 但有件事让我烦恼 我希望实现每个单元格都适合我的集合视图的一行 因此 根据项目数计算单元格宽度 在 iPhone 上一切正常 但在 iPad 上却看起来不太正常 单元
  • 将 Azure 诊断日志写入 Blob 存储的性能影响

    我们在 Azure 上运行的 C Web 应用程序使用 System Diagnostics Trace 编写跟踪语句以进行调试 故障排除 一旦我们为这些日志启用 blob 存储 使用 Azure 门户中的 应用程序日志记录 blob 选项
  • 将 Serilog 与 Azure 日志流结合使用

    我一直在研究如何使用 Serilog 写入 Azure 日志流 我也在这里找到了一些答案 例如 一个答案是建议登录到特定文件夹中的文件 home LogFiles http 但它似乎对我不起作用 我尝试使用Trace https githu
  • 添加 Material Design 时,布局预览不显示布局

    我正在开发一个 Android 应用程序 一切看起来都很完美 直到我决定使用材料设计在我的主题中 添加后材料设计主题 布局预览不显示预览 但在手机上构建时效果良好 当删除 xml 中使用的材料设计组件时 一切都完美运行 附上我的代码 活动主
  • 列出文件中的 unicode 单词

    我的代码是 f codecs open r C Users Admin Desktop nepali txt r UTF 8 nepali f read split for i in nepali print i 显示文件中的单词 但是当我
  • 如何修复:致命错误:openssl/opensslv.h:RedHat 7 中没有这样的文件或目录

    我有 RedHat Enterprise Linux Server 7 并且下载了 linux 内核版本 4 12 10 我正在尝试编译它 但是当我执行以下命令时 make modules 我收到以下错误 scripts sign file
  • 使用默认过滤器值加载数据表

    尝试使用数据表中的输入框构建自定义搜索 请找到小提琴版本 http jsfiddle net c6cu705n http jsfiddle net c6cu705n 我试图仅加载表中的 San Francisco 值 而不加载其他值 尝试了
  • 如何使 ProgressDialog 可以通过后退按钮取消,但不能通过屏幕点击取消?

    我想做一个ProgressDialog可以通过后退按钮取消 但不能通过屏幕点击取消 目前我使用setCancelable true 然而 在一些较新的设备中 点击屏幕也会取消ProgressDialog 我想禁用屏幕点击操作Progress
  • iOS UITextField 在文本更改时更改位置

    我用它来将文本字段置于相关内容的中心 textField setCenter someObject center textField becomeFirstResponder 这看起来很棒 很漂亮 并且位于对象的中心 可以接受文本 我希望文
  • Python smtplib 代理支持

    我想通过代理发送电子邮件 我目前的实现如下 我通过身份验证连接到 smtp 服务器 成功登录后 我会发送一封电子邮件 它工作正常 但当我查看电子邮件标题时 我可以看到我的主机名 我想通过代理来传输它 任何帮助将不胜感激 Use Socksi
  • OracleConnection 生命周期 - 最佳实践

    我正在使用标准 Oracle 驱动程序连接到数据库 但对于 OracleConnection 的生命周期 我不太同意我的同事的观点 创建成本高吗 它是线程安全的吗 我可以在请求之间重复使用它 还是应该为每个请求创建一个新的 如果能更详细地解
  • 从 ExecutorService 更新 JProgressBar

    我正在使用 Java ICMP ping 功能对网关进行 ping 操作 为了执行快速 ping 我使用 ExectorService 创建用于 ping 的线程 地址被 ping 或不 后 我想在 ping 后更新 Jprogressba
  • Eclipse 和 Android XML 布局给出“‘默认’不是任何设备/区域设置组合的最佳匹配”

    这是我第一次使用 XML 布局制作应用程序 过去我总是在运行时动态生成布局 所以不用担心 我不是 Android 新手 不过 这是我第一次使用静态布局 那么这条消息到底是关于什么的呢 2010 09 22 20 43 23 Rockport
  • Bootstrap css,如何使导航栏切换始终可见?

    我想添加在移动设备上显示的按钮之一 以便打开导航栏中的折叠菜单 但到目前为止还无法做到 这里是较少的代码和 html navbar toggle always navbar toggle media min width 768px disp
  • MongoDB 汇总之前所有周的每周总和

    我有一系列 MongoDB 文档 一个示例文档是 createdAt Mon Oct 12 2015 09 45 20 GMT 0700 PDT year 2015 week 41 想象一下这些跨越一年中的所有几周 并且同一周可能有很多 我