2017-05-09 96 views
0

在一個集合具有以下通式結構:訪問的外部參數和文檔中的mongodb組聚合

{_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 method

的一種方式是:

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函數來做到這一點。我可以使用迭代器對象,但感覺哈克。

問題2:有沒有辦法從finalize函數中訪問原始文檔,以便在結果中包含一些額外的數據?從原來的文件,如clientName即項目額外的字段:

{clientId: 'cid1', count: 2, clientName: 'Jon'} 
{clientId: 'cid2', count: 1, clientName: 'Doe'} 

澄清的問題2, 一)我可以添加額外的領域reducer函數內,但感覺多餘的包括不應該運行代碼在每一次迭代。 二)我可以使用聚合管道來實現這樣的事情,但我想知道如果我能做到這一點與Collection.group這裏

回答

0

雖然文檔周圍挖我找到了答案,以問題1這是使用Code class爲減速機功能。 Code構造函數採用第二個參數,其功能與完全相同,如mapReduce例如:

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 
}