2010-12-17 14 views
2

Ich erstellte Karte/Funktionen zum Gruppieren von Aufgaben in einem Ergebnisobjekt zu reduzieren. Ich schrieb in Python mit Verwendung pymongo Bibliothek:MongoDB Map/Reduzieren Ausnahme auslösen: fehlgeschlagen: db Assertion Fehler

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 als Eingabe Aufgaben Abfragen in der gleichen Reihenfolge. Aber wenn ich benutze Art param in Anfrage:

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 Sortierung param:

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

Es ist Arbeit ziemlich fein.

Wo kann das Problem sein?

+1

Was passiert, wenn Sie zuerst die Sortierung vornehmen? 'res = db.tasks.map_reduce (m, r, sort = {'Position': pymongo.ASCENDING}, Abfrage = {'job_id': job_id})' Es sollte nicht wichtig sein, aber falls ja, haben Sie vielleicht gefunden ein Käfer? –

+0

Ich werde dies versuchen und Sie wissen lassen –

+0

ammm ... Sie hatten Recht, wenn Reihenfolge der Parameter ändern, funktioniert es. –

Antwort

2

Ich habe mein Problem gefunden. Wie von einem der Entwickler gesagt wurde, können wir die Sortierung ohne Indizes nicht verwenden. Wenn Sie also die Sortierung verwenden, müssen Sie zuerst einen Index für diese Sortierung erstellen.

Verwandte Themen