如何在MongoDB中的reduce()函数中保存数据?

Kur*_*tis 7 mapreduce mongodb

在MongoDB中,我正在尝试编写Map-Reduce函数,只有在满足特定条件时才会保存数据.

我无法弄清楚如何从我的减速器发射().它总是以某种方式保存数据.

这是一个通用的例子.忽略数据的上下文 - 我仅为此问题创建了此数据和代码.

数据集:

{ "_id" : ObjectId("52583b3a58da9769dda48853"), "date" : "01-01-2013", "count" : 1 }
{ "_id" : ObjectId("52583b3d58da9769dda48854"), "date" : "01-01-2013", "count" : 1 }
{ "_id" : ObjectId("52583b4258da9769dda48855"), "date" : "01-02-2013", "count" : 1 }
{ "_id" : ObjectId("52583b4f58da9769dda48856"), "date" : "01-03-2013", "count" : 4 }
Run Code Online (Sandbox Code Playgroud)

地图功能:

// Map all data by (date, count)
var map = function() {
    var key = this.date;
    var value = this.count;
    emit(key, value);
}
Run Code Online (Sandbox Code Playgroud)

简化忽略不需要的数据的Reducer.

// Only save dates which have count > 2
var reducer = function(date, counts) {
    var sum = Array.sum(counts);
    if (sum > 2) {
        return sum;
    }
}
Run Code Online (Sandbox Code Playgroud)

结果(值1不被忽略):

{ "_id" : "01-01-2013", "value" : null }
{ "_id" : "01-02-2013", "value" : 1 }
{ "_id" : "01-03-2013", "value" : 4 }
Run Code Online (Sandbox Code Playgroud)

我还在一个空的return语句中添加了,但得到了相同的结果:

// Only save dates which have count > 2
var reducer = function(date, counts) {
    var sum = Array.sum(counts);
    if (sum > 2) {
        return sum;
    }
    else return;
}
Run Code Online (Sandbox Code Playgroud)

我想要发生的是在运行Map-Reduce之后,我的输出集合中只存在以下数据.我怎么能做到这一点?

{ "_id" : "01-03-2013", "value" : 4 }
Run Code Online (Sandbox Code Playgroud)

Cri*_*scu 3

您可以使用以下函数运行额外的 mapReduce 操作:

var second_map = function() { 
    if(this.value > 2) {
        emit(this._id, this.value);
    }
}
Run Code Online (Sandbox Code Playgroud)

var second_reduce = function() {}
Run Code Online (Sandbox Code Playgroud)

reduce 函数可以为空,因为每个键没有多个值将导致在这种情况下甚至不会被调用。

因此,像这样运行mapReduce:

db.map_reduce_example.mapReduce(
    second_map, second_reduce, {out: 'final_mapreduce_result'});
Run Code Online (Sandbox Code Playgroud)

将产生以下集合:

> db.final_mapreduce_result.find()
{ "_id" : "01-03-2013", "value" : 4 }
Run Code Online (Sandbox Code Playgroud)

请注意,如果您决定使用此方法,则可以if (sum > 2)从第一个归约函数中删除条件。

  • 如果您只是想过滤一些结果,我不会做映射/减少。只需在第一个 Map/Reduce 之后进行删除即可: db.mroutput.remove( { value : { $lte : 2 } } )。remove() 的运行速度比 map/reduce 快得多。 (3认同)