对 mongodb 上的大量数据求和

本文关键字:数据 求和 mongodb | 更新日期: 2023-09-27 18:35:42

我正在寻找对mongodb执行求和查询的最有效方法。

目前,我们插入包含各种信息和文档创建时间的日期时间戳的文档。

我们需要对这些数据进行汇总,以便通过以下方式查看:

按一天中的小时划分的文档 1-24按月几划分的文档 1-28/31按年份划分的文件 1-12按年份分类的文件

这些汇总的数据将经常被访问,因为我们担心在 mongo 上抛出的大量数据在经常对这些数据求和时会遇到问题。

我们认为,也许当一个文档插入 mongo 时,我们有另一个文档包含我们在插入时递增的这些计数。这样,我们可以快速提取计数,而无需对每个请求的数据求和。我们担心这可能不是在 mongo 中执行此类操作的最有效方法

关于实现这一目标的最佳方法的任何想法?我的开发团队和我自己都是mongodb的新手,我们希望确保我们不会陷入对大量数据集求和的性能陷阱。

对 mongodb 上的大量数据求和

聚合框架非常适合这种类型的查询。
我在下面为您做了一些示例。

首先,让我们填充一些文档:

db.myDocumentCollection.insert({"date" : new Date('01/01/2012'), "主题" : "我的标题 1"});db.myDocumentCollection.insert({"date" : new 日期('01/02/2012'), "主题" : "我的标题 2"}); db.myDocumentCollection.insert({"date" : new Date('01/02/2012'), "主题" : "我的标题 3"});db.myDocumentCollection.insert({"date" : new 日期('01/02/2012'), "主题" : "我的标题 4"}); db.myDocumentCollection.insert({"date" : new Date('01/04/2012'), "主题" : "我的标题 5"});db.myDocumentCollection.insert({"date" : new 日期('01/05/2012'), "主题" : "我的标题 6"}); db.myDocumentCollection.insert({"date" : new Date('01/07/2013'), "主题" : "我的标题 7"});db.myDocumentCollection.insert({"date" : new 日期('01/07/2013'), "主题" : "我的标题 8"}); db.myDocumentCollection.insert({"date" : new Date('02/07/2013'), "主题" : "我的标题 9"});db.myDocumentCollection.insert({"date" : new 日期('02/08/2013'), "主题" : "我的标题 10"});

返回按完整日期分组的文档数

db.myDocumentCollection.group(
{
   $keyf : function(doc) {
       return { "date" : doc.date.getDate()+"/"+doc.date.getMonth()+"/"+doc.date.getFullYear() };
    },
    initial: {count:0},
    reduce: function(obj, prev) { prev.count++; }
 })

输出

[
        {
                "date" : "1/0/2012",
                "count" : 1
        },
        {
                "date" : "2/0/2012",
                "count" : 3
        },
        {
                "date" : "4/0/2012",
                "count" : 1
        },
        {
                "date" : "5/0/2012",
                "count" : 1
        },
        {
                "date" : "7/0/2013",
                "count" : 2
        },
        {
                "date" : "7/1/2013",
                "count" : 1
        },
        {
                "date" : "8/1/2013",
                "count" : 1
        }
]

返回 2013 年按月几分组的文档数

这可能与您要执行的查询类型更相关。
在这里,我们使用cond指定仅在 2013
年 1 月 1 日之后对文档进行分组您可以使用$gte$lte在此处确定日期范围。

db.myDocumentCollection.group(
{
   $keyf : function(doc) {
       return { "date" : doc.date.getDate()+"/"+doc.date.getMonth()};
    },
    cond: {"date" : {"$gte": new Date('01/01/2013')}},
    initial: {count:0},
    reduce: function(obj, prev) { prev.count++; }
 })

输出

[
        {
                "date" : "7/0",
                "count" : 2
        },
        {
                "date" : "7/1",
                "count" : 1
        },
        {
                "date" : "8/1",
                "count" : 1
        }
]