2011-03-28 13 views
3

mongoコマンドラインを直接使用しているときにpymongoを使用すると、mongoとmap/reduceを使い始めました。次のエラーが表示されます。これと同様の質問ですが、私のはるかに基本的なようです)。pymongo mapreduce dbアサーションエラー

私はpymongoのドキュメントから直接例を使用しています:http://api.mongodb.org/python/1.3%2B/examples/map_reduce.html

from pymongo import Connection 
from pymongo.code import Code 

db = Connection().map_reduce_example 
db.things.insert({"x": 1, "tags": ["dog", "cat"]}) 
db.things.insert({"x": 2, "tags": ["cat"]}) 
db.things.insert({"x": 3, "tags": ["mouse", "cat", "dog"]}) 
db.things.insert({"x": 4, "tags": []}) 


m = Code("function() {this.tags.forEach(function(z) {emit('d, 1);});}") 
m = Code("function() {emit('dog', 1);}") 

r = Code("function (key, values) {var total = 0;for (var i = 0; i < values.length; i++) {total += values[i];}return total;}") 


result = db.things.map_reduce(m, r) 

これは私に次のエラー得られます。マップを定義する、しかし

Traceback (most recent call last): 
    File "demo.py", line 17, in <module> 
    result = db.things.map_reduce(m, r) 
    File "/usr/local/lib/python2.6/dist-packages/pymongo-1.9-py2.6-linux-i686.egg/pymongo/collection.py", line 943, in map_reduce 
    map=map, reduce=reduce, **kwargs) 
    File "/usr/local/lib/python2.6/dist-packages/pymongo-1.9-py2.6-linux-i686.egg/pymongo/database.py", line 293, in command 
    msg, allowable_errors) 
    File "/usr/local/lib/python2.6/dist-packages/pymongo-1.9-py2.6-linux-i686.egg/pymongo/helpers.py", line 119, in _check_command_response 
    raise OperationFailure(msg % response["errmsg"]) 
pymongo.errors.OperationFailure: command SON([('mapreduce', u'things'), ('map', Code("function() {emit('dog', 1);}", {})), ('reduce', Code('function (key, values) {var total = 0;for (var i = 0; i < values.length; i++) {total += values[i];}return total;}', {}))]) failed: db assertion failure 

を/モンゴやランニングに機能を削減次のコマンドが機能します。

db.things.mapReduce(mm,r,{out:{inline:1}}) 

定義するd ifferenceは{out:{inline:1}}オプションのようです。それをpymongoで呼び出す方法はありますか?

ありがとう、

アダム。

答えて

5

問題は 'out'パラメータに関連しています。 MongoDB 1.7.4から始めるには、 'out'パラメータが必要です。map_reduceを呼び出すときは、常に出力コレクションの名前を指定する必要があります。

result = db.things.map_reduce(m, r, "output_collection_name") 

MapReduce操作全体をメモリ内で実行する場合は、代わりにinline_map_reduceを呼び出します。

result = db.things.inline_map_reduce(m, r) 

上記の例は、gitリポジトリから直接入手した最新バージョンのpymongoでのみ動作します。 pongongo 1.9はMongoDB 1.7.4以上ではうまく動作しません。

+0

これはトリックでした。本当にありがとう。 – alaiacano

関連する問題