4

pymongo(または少なくともドキュメント)にバグがあり、findandupdateクエリを実行できなくなっていると思います。

これが何が起こるかです。私が走るとき:

    result = db.command({
        'findandmodify': 'my_collection',
        'query': {'foo': 'bar'},
        'update': {'$set': {'status': 'queued'}},
    })

実際にサーバーに送信されるクエリは次のとおりです。

{ 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … }

query引数が最初で、2番目findandmodifyであることに注意してください。

しかし、これによりサーバーはスローアップします。

OperationFailure:コマンド{'クエリ':{'foo':'bar'}、'findandmodify':'my_collection'、…}失敗:そのようなコマンドはありません

サーバーfindandmodifyが最初になることを期待しているためです(BSON dictは明らかに順序付けられています)。

これに対する回避策はありますか?

4

4 に答える 4

6

ソートされたdictタイプが組み込まれていない言語の場合、mongoドライバーには1つ含まれています。SONタイプであるPythonの場合:http://api.mongodb.org/python/1.4%2B/api/pymongo/son.html。すべてのコマンドにそれを使用する必要があります。

それでも失敗する場合は、findandmodifyが新機能であるため、データベースの最新バージョンを使用していることを確認してください。

于 2010-02-28T15:38:40.917 に答える
3

現在のpymongoapiにはfind_and_modifyが組み込まれています。詳細については、https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/collection.py#L1035を参照してください。

于 2011-06-05T04:35:00.060 に答える
2

回避策の1つは、JavaScriptバージョンのコマンドを作成してdb.eval()に渡すことです。

db.eval('db.runCommand({"findandmodify": "my_collection", "query": {"foo": "bar"}, "update": {"$set": {"status": "queued"}},})')

問題は、Alexが述べたように、Python dictには順序がないため、文字列を多かれ少なかれ手動で作成する必要があるということです。

于 2010-02-28T06:50:15.237 に答える
1

PyMongoのドキュメントを参照してください。

コマンドドキュメント内のキーの順序は重要であることに注意してください(「動詞」が最初に来る必要があります)。したがって、複数のキーを必要とするコマンド(たとえば、findandmodify)は、Pythondictの代わりにSONまたは文字列とkwargsのインスタンスを使用する必要があります。

http://api.mongodb.org/python/2.1/api/pymongo/database.html

于 2012-02-21T19:48:37.593 に答える