Aggregation Framework非常適合這種類型的查詢。
我在下面爲你做了一些例子。
首先,讓我們填充一些文件:
db.myDocumentCollection.insert({ 「日期」,新的日期(01/01/2012' ), 「主題」:「我的標題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。插入({「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++; }
})
輸出的每月的一天爲2013年
分組文件
[
{
"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
}
]
返回數
這可能與您想要執行的查詢類型更相關。
在這裏,我們使用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
}
]
你似乎有一個可行的解決方案,以及它是否是在* *最有效的方式,它當然應該處理好「求和龐大」的問題。聽起來,低效率的唯一真正潛力是,如果您要添加文檔的速度足夠快,打開,修改和保存「總計」文檔成爲一項重大成本。爲什麼不實施你想出來的東西然後測試? –
這就是我們可能會用到的。不知道是否有更好的方式來處理這種情況 –
此選項將每次讀取訪問成本歸結爲「打開文檔,讀取文檔」。 (在添加「打開文檔,讀取文檔,寫入文檔」到您的添加成本中)。作爲一個對mongodb毫無經驗的人說話,我懷疑這個代價是如此之高。如果它*太高,真正的答案就是採用相同的計劃,但找到可以更快訪問的地方來存儲它。 –