2010-12-17 44 views
2

タスク結果を1つの結果オブジェクトにグループ化するmap/reduce関数を作成しました。 MongoDB Map/Reduce raise例外:失敗:dbアサーションエラー

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

と私は、その結果オブジェクトは、入力されたタスクのクエリと同じ順序である必要があります:私はpymongoライブラリを使用してpythonでで書きました。

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 

私は、ソートのparamなしで同じクエリを使用する場合:

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

をそれはかなりの仕事だが、私は、要求のソートのparamを使用する場合良い。

どこに問題がありますか?

+1

ソートを先に行うとどうなりますか? 'res = db.tasks.map_reduce(m、r、sort = {' position ':pymongo.ASCENDING}、query = {' job_id ':job_id}) 'それは問題ではありませんが、バグ? –

+0

私はこれを試してみて、あなたに知らせてください –

+0

ammm ... paramsの変更命令が働くならあなたが正しいと思います。 –

答えて

2

私の問題が見つかりました。開発者の一人が言ったように、インデックスなしでソートすることはできません。ソートを使用する場合は、まずそのソートのインデックスを作成する必要があります。

関連する問題