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?

War es hilfreich?

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
scroll top