1

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

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

我们需要对这些数据求和以通过以下方式查看:

一天中每小时的文件 1-24 一个月中的一天的文件 1-28/31 一年中的一个月的文件 1-12 一年中的文件

这些汇总的数据将经常被访问,因为我们担心在 mongo 中抛出的大量数据会经常对这些数据进行汇总。

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

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

4

1 回答 1

1

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

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

db.myDocumentCollection.insert({"date" : new Date('01/01/2012'), "topic" : "My Title 1"}); db.myDocumentCollection.insert({"date" : new Date('01/02/2012'), "topic" : "My Title 2"}); db.myDocumentCollection.insert({"date" : new Date('01/02/2012'), "topic" : "My Title 3"}); db.myDocumentCollection.insert({"date" : new Date('01/02/2012'), "topic" : "My Title 4"}); db.myDocumentCollection.insert({"date" : new Date('01/04/2012'), "topic" : "My Title 5"}); db.myDocumentCollection.insert({"date" : new Date('01/05/2012'), "topic" : "My Title 6"}); db.myDocumentCollection.insert({"date" : new Date(' 01/07/2013'), "主题" : "我的标题 7"}); db.myDocumentCollection.insert({"date" : new Date('01/07/2013'), "topic" : "My Title 8"}); db.myDocumentCollection.insert({"date" : new Date('02/07/2013'), "topic" : "My Title 9"}); db.myDocumentCollection.insert({"date" : new Date('02/08/2013'), "topic" : "My Title 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 日之后的文档进行分组。
您可以在此处使用$gteand$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
        }
]
于 2012-11-13T11:09:33.850 回答