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?

War es hilfreich?

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top