Question

Je créé map / reduce fonctions à des tâches de groupe résultats dans un objet résultat. J'ai écrit en python avec l'aide de la bibliothèque pymongo:

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

Et je dois cet objet résultat soit dans le même ordre que les tâches d'entrée des requêtes. Mais quand je l'utilise dans la requête sorte param:

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

Mais cette exception augmentation dans 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

Quand j'utilise la même requête sans tri param:

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

Il assez de beau travail.

Où peut-être le problème?

Était-ce utile?

La solution

J'ai trouvé mon problème. Comme l'a dit un des développeurs, nous ne pouvons pas utiliser le tri sans index. Donc, si vous utilisez le tri, tout d'abord, vous devez créer un index pour que le tri.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top