3

mongo と map/reduce を使い始めたばかりで、pymongo を使用すると、mongo コマンドラインを直接使用したときに得られない次のエラーが発生します (これと同様の質問があることに気付きました。しかし、私のものははるかに基本的なようです)。

私は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

ただし、mongo で map/reduce 関数を定義し、次のコマンドを実行すると機能します。

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

決定的な違いは {out:{inline:1}} オプションのようです。それをpymongoの呼び出しに入れる方法はありますか?

ありがとう、

アダム。

4

1 に答える 1

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 でのみ機能します。pymongo 1.9 は MongoDB 1.7.4 以降ではうまく動作しません。

于 2011-03-29T12:24:47.860 に答える