c# - 对mongodb上的大量数据进行汇总

标签 c# mongodb database

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

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

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

每天 1-24 小时的文档 文档按月份 1-28/31 按年份划分的文件 1-12 按年份列出的文件

这些求和数据将被经常访问,因为我们担心向 mongo 抛出的大量数据在经常求和这些数据时会出现问题。

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

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

最佳答案

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

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

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'), "topic" : "My Title 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 日之后的文档进行分组
您可以在此处使用 $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
        }
]

关于c# - 对mongodb上的大量数据进行汇总,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10820835/

相关文章:

c# - 使用 LINQ 在列表中查找项目但得到 "Value cannot be null. Parameter name: source"

c# - 从指定列和行中的数据网格收集数据

mongodb - 在合理的时间内使用 mongoDB 检索大量记录

database - IBM-Watson 云产品中输入要求的数据格式是什么?

database - 如何在 Visual Studio 2008 中连接到 Access 2007 (accdb) 文件

mysql - 我应该如何解析MySQL中的--secure-file-priv?

c# - 字典查找我们想要包含在字符串中的键的位置

c# - 没有接口(interface)的密封类的复合模式

node.js - 等待函数,然后控制台结果

java - 将MongoDB用作hadoop map-reduce作业的I/O