pymongo:findandmodify - 「いいえ、そのようなコマンドが」返されます
質問
私はそれは不可能findandupdate
クエリを実行できるようになりpymongoのバグ(あるいは、少なくとも、ドキュメント)があると信じています。
ここで何が起こるかです。私は実行すると:
result = db.command({
'findandmodify': 'my_collection',
'query': {'foo': 'bar'},
'update': {'$set': {'status': 'queued'}},
})
実際にサーバに送信されますクエリがあります:
{ 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … }
注query
引数があることを第一、及びfindandmodify
ある第二
しかし、これは投げるためにサーバーが発生します:
OperationFailure: command { 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … } failed: no such cmd
サーバーを期待は(BSONのdictsは、明らかに、順序付けられている)。最初にするfindandmodify
ので、
このために周りのすべての作業が?あります。
解決
内蔵のソートdictのタイプのmongoドライバは1が含まれていない言語の場合。 ます。http://api.mongodb SONタイプであるPythonで.ORG /パイソン/ 1.4%2B / API / pymongo / son.htmlする。あなたはすべてのコマンドのためにそれを使用する必要があります。
それはまだメイクを失敗した場合は必ずfindandmodifyの新機能であるとして、データベースの最新バージョンを使用しています。
他のヒント
現在のpymongo APIはfind_and_modify組み込まれています https://github.com/でもっと見ますMongoDBの/ Mongoの-Pythonのドライバ/ BLOB /マスター/ pymongo / collection.py#L1035 の
一つの回避策は)コマンドのJavaScriptのバージョンを構築し、(db.evalにそれを渡すことができる。
db.eval('db.runCommand({"findandmodify": "my_collection", "query": {"foo": "bar"}, "update": {"$set": {"status": "queued"}},})')
問題は、アレックスが述べたようにあなたは、多かれ少なかれ、手動で文字列を構築する必要がありますので、Pythonのdictsには、何の秩序を持っていない、ということです。
を参照してくださいPyMongoドキュメンテーションます:
コマンドドキュメント内のキーの順序に注意が(重要です 「動詞」最初に来なければならない)、複数のキーを必要とするコマンドので(例えば、 findandmodify)SONのインスタンスまたは文字列とkwargsからを使用する必要があります 代わりにPythonの辞書のます。
http://api.mongodb.org/python/2.1/ API / pymongo / database.htmlする