首页 文章

MapReduce,MongoDB和node-mongodb-native

提问于
浏览
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函数的结果(在这种情况下没有'testing') . 有任何想法吗?

2)除非在用于排序的字段(在这种情况下是计数字段)上定义了索引,否则我会收到错误 . 我知道这是可以预料的 . 它似乎效率低,因为肯定正确的索引是(_id,count)而不是(count),因为理论上应首先使用_id(对于查询),然后才应将排序应用于适用的结果 . 我在这里错过了什么吗? MongoDB效率低下吗?这是一个错误吗?

谢谢! :)

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

相关问题