[英]Accessing external parameters and document in mongodb group aggregation
在具有以下常規結構的集合中:
{_id: 'id1', clientId: 'cid1', clientName:'Jon', item: 'item1', dateOfPurchase: '...'},
{_id: 'id2', clientId: 'cid1', clientName:'Jon', item: 'item2', dateOfPurchase: '...'},
{_id: 'id3', clientId: 'cid2', clientName:'Doe', item: 'itemX', dateOfPurchase: '...'}
... etc
目的是創建一個按clientId
分組的分組,以計算一些簡單的統計數據,例如,每個clientId的總出現次數。
使用Node.js MongoDB驅動程序API Collection.group方法實現此目的的一種方法是:
db.collection.group(
'clientId',
{},
{ count: 0 },
function(obj, prev) {
prev.count++;
},
true
}
上面的示例數據的輸出類似於:
{clientId: 'cid1', count: 2}
{clientId: 'cid2', count: 1}
問題1:將某些外部值傳遞給reducer
函數的最佳方法是什么? 例如,我可能想為在特定日期之前/之后進行的購買計算不同的計數,並希望將此日期作為參數傳遞。 我知道使用mapReduce
可以將scope
選項用於此目的。 我想知道是否有一種方法可以使用group
功能。 我可以使用iterator對象,但是感覺很笨拙。
問題2:是否可以從finalize
函數內部訪問原始文檔,以便在結果中包含一些額外數據? 即從原始文檔(例如clientName
投影額外的字段:
{clientId: 'cid1', count: 2, clientName: 'Jon'}
{clientId: 'cid2', count: 1, clientName: 'Doe'}
對問題2的澄清:a)我可以在reducer
函數內添加多余的字段,但是包含不應在每次迭代中運行的代碼感到多余。 b)我可以使用聚合管道來實現類似的功能,但是我想知道是否可以使用Collection.group
做到這一點
在仔細閱讀文檔時,我找到了問題1的答案,即對Coder函數使用Code類 。 Code
構造函數使用第二個參數,其功能與mapReduce
scope
完全相同,例如:
const myFunction = function(obj, prev) {
if (prev.count < myLimit) // myLimit is available here because it is defined in the Code initialization below
prev.count++;
}
Code = require('mongodb').Code;
db.collection.group(
'clientId',
{},
{ count: 0 },
new Code(myFunction, { myLimit: 5 }),
true
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.