3

我正在使用 node-mongodb-native 库在 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) 除非在用于排序的字段(在本例中为计数字段)上定义了索引,否则我会收到错误消息。我明白这是意料之中的。这似乎效率低下,因为正确的索引肯定是 (_id, count) 而不是 (count),因为理论上应该首先使用 _id(用于查询),然后才应该将排序应用于适用的结果。我在这里错过了什么吗?MongoDB效率低下吗?这是一个错误吗?

谢谢!:)

4

1 回答 1

4

从未调用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);
    }
);

请注意,我们是通过“group”键发出的,这意味着有 n >= 0 个条目由“group”键分组。由于您发出 _id 每个键都是唯一的,因此不需要 reduce 功能。

http://docs.mongodb.org/manual/reference/command/mapReduce/#requirements-for-the-reduce-function

于 2013-08-13T11:17:02.163 回答