MongoDB MAP/уменьшение повышения исключения: неудача: сбой утверждения БД
Вопрос
Я создал функции 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})
Это работа довольно хорошо.
Где может быть проблема?
Решение
Я нашел свою проблему. Как сказал один из разработчиков, мы не можем использовать сортировку без индексов. Так что, если вы используете сортировку, прежде всего, вы должны создать индекс для этой сортировки.
Не связан с StackOverflow