MongoDB映射减少对db.collection.find()产生不同结果
我有一张这样的地图: 地图: 减少:MongoDB映射减少对db.collection.find()产生不同结果,mongodb,mapreduce,Mongodb,Mapreduce,我有一张这样的地图: 地图: 减少: function(key, values) { va
function(key, values) {
var result = {sent: 0, received: 0, entries:0};
values.forEach(function (value) {
result.sent += value.sent;
result.received += value.received;
result.entries += 1;
});
return result;
}
function(key, values) {
var result = {sent: 0, received: 0, entries:0};
values.forEach(function (value) {
result.sent += value.sent;
result.received += value.received;
result.entries += value.entries;
});
return result;
}
正如您所看到的,我一直在监视结果映射中处理的条目数量。我发现我得到的访问记录比我应该得到的要少得多
对于我的特定数据集,输出如下:
[{u'id':u'1743',u'value':{u'received':1406545.0,u'sent':26251138.0,u'entries':316.0}]
当我运行带有查询选项的MapReduce时,指定用户名和日期范围
如果使用db.collection.find()执行相同的查询,则计数不同:
> db.entire_database.find({username: '1743', time : { $lte: ISODate('2011-08-12 12:40:00'), $gte: ISODate('2011-08-12 08:40:00') }}).count()
1915
完整的map reduce查询如下所示:
db.entire_database.mapReduce(m, r, {out: 'myoutput', query: { username: '1743', time : { $lte: ISODate('2011-08-12 12:40:00'), $gte: ISODate('2011-08-12 08:40:00') } } })
所以基本上,我不确定为什么计数有如此大的不同?为什么find()给我1915,而map reduce是316?你的
map
函数需要发出一个与reduce
函数形式相同的对象(即,它应该将entries
字段设置为1)。你可以阅读更多关于这方面的内容
基本上,传递给reduce
函数的值不一定是map
发出的原始输出。对map
生成的值的“组”多次调用reduce
函数,而不是调用一次,然后将其结果传递到reduce
函数的进一步调用中,再次进行组合。这就是MapReduce在水平方向上可伸缩的原因,因为任何一组发出的值都可以在以后合并之前以任何顺序分配给任何服务器
因此,我将对您的函数进行如下的重新构造:
地图:
减少:
function(key, values) {
var result = {sent: 0, received: 0, entries:0};
values.forEach(function (value) {
result.sent += value.sent;
result.received += value.received;
result.entries += 1;
});
return result;
}
function(key, values) {
var result = {sent: 0, received: 0, entries:0};
values.forEach(function (value) {
result.sent += value.sent;
result.received += value.received;
result.entries += value.entries;
});
return result;
}
map
函数需要发出一个与reduce
函数形式相同的对象(即,它应该将entries
字段设置为1)。你可以阅读更多关于这方面的内容
基本上,传递给reduce
函数的值不一定是map
发出的原始输出。对map
生成的值的“组”多次调用reduce
函数,而不是调用一次,然后将其结果传递到reduce
函数的进一步调用中,再次进行组合。这就是MapReduce在水平方向上可伸缩的原因,因为任何一组发出的值都可以在以后合并之前以任何顺序分配给任何服务器
因此,我将对您的函数进行如下的重新构造:
地图:
减少:
function(key, values) {
var result = {sent: 0, received: 0, entries:0};
values.forEach(function (value) {
result.sent += value.sent;
result.received += value.received;
result.entries += 1;
});
return result;
}
function(key, values) {
var result = {sent: 0, received: 0, entries:0};
values.forEach(function (value) {
result.sent += value.sent;
result.received += value.received;
result.entries += value.entries;
});
return result;
}