【问题标题】:MongoDB Map/Reduce raise exception: failed: db assertion failureMongoDB Map/Reduce 引发异常:失败:数据库断言失败
【发布时间】:2011-05-27 01:30:42
【问题描述】:

我创建了 map/reduce 函数来将任务结果分组为一个结果对象。我使用 pymongo 库在 python 中写入:

    m = Code("""function() {
        data = {};
        res = ''
        if(this.result_id) {
            res={'objectid':this.result_id.toString()};
        } else {
            res=this.result;
        }
        emit(this.data, res);
    }""")
    r = Code("""function(k,values) { 
        data={};
        for(var i=0; i<values.length; i++ ) {
            for(attr in values[i])
                data[attr]=values[i][attr];
        }
        return data
    }""")

我需要该结果对象与输入任务查询的顺序相同。但是当我在请求中使用排序参数时:

   res = db.tasks.map_reduce(m, r, query={'job_id':job_id},sort={'position':pymongo.ASCENDING})

但这会在 mongodb 中引发异常:

    Traceback (most recent call last):
      File "/usr/local/lib/python2.6/dist-packages/gevent/greenlet.py", line 403, in run
        result = self._run(*self.args, **self.kwargs)
      File "/data/www/public/app/seotools/daemon/scripts/mainconverter.py", line 129, in work
        res = autoreconnect(self.db.tasks.map_reduce,m, r, query={'job_id':job_id},sort={'position':1})
      File "/data/www/public/app/seotools/daemon/lib/db/mongo.py", line 95, in autoreconnect
        result = func(*args,**kwargs)
      File "/usr/local/lib/python2.6/dist-packages/pymongo-1.8.1-py2.6-linux-x86_64.egg/pymongo/collection.py", line 945, in map_reduce
        map=map, reduce=reduce, **kwargs)
      File "/usr/local/lib/python2.6/dist-packages/pymongo-1.8.1-py2.6-linux-x86_64.egg/pymongo/database.py", line 294, in command
        (command, result["errmsg"]))
    OperationFailure: command SON([('mapreduce', u'tasks'), ('sort', {'position': 1}), ('query', {'job_id': ObjectId('4d0b30909c7684b60e000000')}), ('reduce', Code('function(k,values) { 
        data={};
        for(var i=0; i<values.length; i++ ) {
            for(attr in values[i])
                data[attr]=values[i][attr];
       }
        return data
    }', {})), ('map', Code("function() {
        data = {};
        res = ''
        if(this.result_id) {
            res={'objectid':this.result_id.toString()};
        } else {
            res=this.result;
        }
        emit(this.data, res);
    }", {}))]) failed: db assertion failure

当我使用没有排序参数的相同查询时:

   res = db.tasks.map_reduce(m, r, query={'job_id':job_id})

它工作得很好。

问题可能出在哪里?

【问题讨论】:

  • 将排序放在首位会发生什么? res = db.tasks.map_reduce(m, r, sort={'position':pymongo.ASCENDING},query={'job_id':job_id}) 没关系,但如果是,你可能发现了一个错误?
  • 我会试试这个并告诉你
  • ammm...你是对的,如果改变参数的顺序就可以了。

标签: python mongodb mapreduce pymongo


【解决方案1】:

我发现了我的问题。正如一位开发人员所说,我们不能在没有索引的情况下使用排序。所以如果你使用排序,首先你必须为排序创建一个索引。

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 2021-11-07
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2012-06-25
    相关资源
    最近更新 更多