Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB映射减少对db.collection.find()产生不同结果_Mongodb_Mapreduce - Fatal编程技术网

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;
}