【发布时间】:2017-10-07 04:07:25
【问题描述】:
在具有以下一般结构的集合中:
{_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 函数来做到这一点。我可以使用迭代器对象,但感觉很hacky。
问题 2: 有没有办法从 finalize 函数内部访问原始文档,以便在结果中包含一些额外的数据?即从原始文档中投影额外的字段,例如clientName:
{clientId: 'cid1', count: 2, clientName: 'Jon'}
{clientId: 'cid2', count: 1, clientName: 'Doe'}
对问题 2 的说明,
a) 我可以在 reducer 函数中添加额外的字段,但是包含不应该在每次迭代中运行的代码感觉是多余的。
b)我可以使用聚合管道来实现这样的事情,但我想知道我是否可以在这里使用Collection.group 来做到这一点
【问题讨论】:
标签: node.js mongodb mongodb-query