我正在使用node- MongoDB本地库在MongoDB上运行一个MapReduce (来自node.js)。
下面是我的代码:
var map = function() {
emit(this._id, {'count': this.count});
};
var reduce = function(key, values) {
return {'testing':1};
};
collection.mapReduce(
map,
reduce,
{
query:{ '_id': /s.*/g },
sort: {'count': -1},
limit: 10,
jsMode: true,
verbose: false,
out: { inline: 1 }
},
function(err, results) {
logger.log(results);
}
);两个问题:
1)基本上,我的reduce函数被忽略。无论我在其中放入什么,输出都只是我的map函数的结果(在本例中没有‘测试’)。有什么想法吗?
2)除非在用于排序的字段(在本例中是count字段)上定义了索引,否则我会得到一个错误。我知道这是意料之中的。它的效率似乎很低,因为正确的索引肯定是( _id,计数)而不是(计数),因为理论上应该首先使用_id(用于查询),然后才应该对适用的结果应用排序。我是不是漏掉了什么?MongoDB是不是很低效?这是一个bug吗?
谢谢!:)
发布于 2013-08-13 19:17:02
reduce函数从不被调用的原因是您为每个键发出了一个值,因此reduce函数没有实际执行的理由。以下是如何触发reduce函数的示例
collection.insert([{group: 1, price:41}, {group: 1, price:22}, {group: 2, price:12}], {w:1}, function(err, r) {
// String functions
var map = function() {
emit(this.group, this.price);
};
var reduce = function(key, values) {
return Array.sum(values);
};
collection.mapReduce(
map,
reduce,
{
query:{},
// sort: {'count': -1},
// limit: 10,
// jsMode: true,
// verbose: false,
out: { inline: 1 }
},
function(err, results) {
console.log("----------- 0")
console.dir(err)
console.dir(results)
// logger.log(results);
}
);注意,我们是通过“>=”键发出的,这意味着有n个组0条目通过"group“键进行分组。因为您发出的是_id,所以每个键都是惟一的,因此不需要reduce函数。
http://docs.mongodb.org/manual/reference/command/mapReduce/#requirements-for-the-reduce-function
https://stackoverflow.com/questions/17644600
复制相似问题