簡體   English   中英

在mongodb組聚合中訪問外部參數和文檔

[英]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.

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