总结mongodb上的大量数据

时间:2012-05-30 16:59:12

标签: c# mongodb database

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

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

我们需要将这些数据加总,以便通过以下方式查看:

每天1-24小时的文件 文件截止日期为1-28 / 31 截至1-12的月份的文件 年份文件

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

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

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

1 个答案:

答案 0 :(得分:1)

Aggregation Framework非常适合此类查询 我在下面为你做了一些例子。

首先,让我们填写一些文件:

  

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
        }
]