MongoDB MAP/уменьшение повышения исключения: неудача: сбой утверждения БД

StackOverflow https://stackoverflow.com/questions/4469693

Вопрос

Я создал функции MAP/уменьшение групповых задач, которые приводят к одному объекту результата. Я написал в Python с использованием библиотеки Pimongo:

    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
    }""")

И мне нужно, чтобы объект результата был в том же порядке, что и входные задачи. Но когда я использую Sort Param в запросе:

   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})

Это работа довольно хорошо.

Где может быть проблема?

Это было полезно?

Решение

Я нашел свою проблему. Как сказал один из разработчиков, мы не можем использовать сортировку без индексов. Так что, если вы используете сортировку, прежде всего, вы должны создать индекс для этой сортировки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top