pymongo: findandmodify - „kein solcher Befehl“ zurückgegeben
Frage
Ich glaube, es ist ein Fehler in pymongo ist (oder zumindest die Dokumentation), die es unmöglich macht, eine findandupdate
Abfrage auszuführen.
Hier ist, was passiert. Wenn ich laufen:
result = db.command({
'findandmodify': 'my_collection',
'query': {'foo': 'bar'},
'update': {'$set': {'status': 'queued'}},
})
Die Abfrage, die tatsächlich an den Server gesendet wird ist:
{ 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … }
Beachten Sie, dass das query
Argument erste und findandmodify
ist zweiten .
Aber dies bewirkt, dass der Server werfen:
OperationFailure: command { 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … } failed: no such cmd
Da die Server erwarten findandmodify
ersten zu sein (BSON dicts ist offenbar zu bestellen).
Gibt es eine Arbeit um für das?
Lösung
Für Sprachen, die nicht über eine eingebaute in sortierter dict Typ umfasst die Mongo Treiber ein. In Python, dass der Sohn Typ: http: //api.mongodb Org / Python / 1,4% 2B / api / pymongo / son.html . Sie müssen, dass für alle Befehle verwenden.
Wenn das immer noch nicht sicher, dass Sie die neueste Version der Datenbank verwenden als findandmodify ein neues Feature ist.
Andere Tipps
Strom pymongo api hat find_and_modify Einbau- Sehen Sie mehr unter https://github.com/ mongodb / mongo-python-Treiber / Blob / Master / pymongo / collection.py # L1035
Eine Abhilfe kann die JavaScript-Version des Befehls zu konstruieren und zu db.eval () übergeben.
db.eval('db.runCommand({"findandmodify": "my_collection", "query": {"foo": "bar"}, "update": {"$set": {"status": "queued"}},})')
Das Problem ist, dass, wie Alex erwähnt, hat Python dicts keine Ordnung, so dass Sie die Zeichenfolge mehr oder weniger benötigen bauen manuell.
Siehe PyMongo Dokumentation:
Beachten Sie die Reihenfolge der Schlüssel in dem Befehl Dokument ist von Bedeutung (die „Verb“ muss zuerst kommen), so dass Befehle, die mehrere Schlüssel erfordern (z.B. findandmodify) sollte eine Instanz von SON oder einen String und kwargs verwenden anstelle eines Python dict.
http://api.mongodb.org/python/2.1/ api / pymongo / database.html