MongoDB Map / Reduce Ausnahme Erhöhung: failed: db Assertionsfehler
Frage
Ich habe Map / Reduce-Funktionen von Gruppenaufgaben Ergebnisse in einem Ergebnisobjekt. Ich schrieb in in Python mit der Verwendung von pymongo Bibliothek:
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
}""")
Und ich brauche das Ergebnis Objekt in der gleichen Reihenfolge wie Eingang Aufgaben Abfragen. Aber wenn ich Art param in Anforderung verwenden:
res = db.tasks.map_reduce(m, r, query={'job_id':job_id},sort={'position':pymongo.ASCENDING})
Aber diese Erhöhung Ausnahme in 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
Wenn ich die gleiche Abfrage ohne Art param:
res = db.tasks.map_reduce(m, r, query={'job_id':job_id})
Es ist Arbeit ziemlich gut.
Wo kann das Problem sein?
Lösung
fand ich mein Problem. Wie von einem der Entwickler sagte, können wir nicht ohne Indizes Sortierung verwenden. Also, wenn Sie verwenden das Sortieren, zunächst einmal müssen Sie einen Index für die Sortierung erstellen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow