簡體   English   中英

在mongodb上匯總大量數據

[英]Summing large amounts of data on mongodb

我正在尋找對mongodb執行匯總查詢的最有效方法。

當前,我們插入包含各種信息的文檔以及創建文檔的日期時間戳。

我們需要對這些數據進行匯總,以便通過以下方式進行查看:

按小時的文件數1-24按月的文件數1-28 / 31按年的文件數1-12按年的文件數

由於我們擔心在mongo上拋出的大量數據會經常會累加這些數據,因此經常會訪問這些匯總的數據。

我們認為,也許將文檔插入mongo時會發現另一個文檔包含這些計數,這些計數在插入時會增加。 這樣,我們可以快速獲取計數,而無需對每個請求的數據求和。 我們擔心的是,這可能不是在mongo中執行此類操作的最有效方法

對實現此目標的最佳方法有何想法? 我的開發團隊以及我本人都是mongodb的新手,我們希望確保不會因匯總大量數據而陷入性能陷阱。

聚合框架非常適合此類查詢。
我在下面為您做了一些例子。

首先,讓我們填充一些文檔:

db.myDocumentCollection.insert({“ date”:新的Date('01 / 01/2012'),“ topic”:“我的標題1”})); db.myDocumentCollection.insert({“ date”:新的Date('01 / 02/2012'),“ topic”:“我的標題2”})); db.myDocumentCollection.insert({“ date”:新的Date('01 / 02/2012'),“ topic”:“我的標題3”})); db.myDocumentCollection.insert({“ date”:新的Date('01 / 02/2012'),“ topic”:“我的標題4”})); db.myDocumentCollection.insert({“ date”:新的Date('01 / 04/2012'),“ topic”:“我的標題5”})); db.myDocumentCollection.insert({“ date”:新的Date('01 / 05/2012'),“ topic”:“我的標題6”})); db.myDocumentCollection.insert({“ date”:新的Date('01 / 07/2013'),“ topic”:“我的標題7”})); db.myDocumentCollection.insert({“ date”:新的Date('01 / 07/2013'),“ topic”:“我的標題8”})); db.myDocumentCollection.insert({“ date”:新的Date('02 / 07/2013'),“ topic”:“我的標題9”})); db.myDocumentCollection.insert({“ date”:新的Date('02 / 08/2013'),“ topic”:“我的標題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
        }
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM