Domanda

Credo che ci sia un bug in pymongo (o, almeno, la documentazione), che rende impossibile eseguire una query findandupdate.

Ecco cosa succede. Quando faccio funzionare:

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

La query che in realtà viene inviato al server è:

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

Si noti che l'argomento query è prima , e findandmodify è secondo .

Ma questo fa sì che il server di vomitare:

OperationFailure: command { 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … } failed: no such cmd

Poiché il server aspetta findandmodify essere il primo (dicts BSON sono, a quanto pare, ordinato).

C'è qualche lavoro in giro per questo?

È stato utile?

Soluzione

Per le lingue che non hanno un tipo dict ordinato integrata nei driver Mongo includono uno. In pitone che è il tipo SON: http: //api.mongodb .org / python / 1,4% 2B / api / pymongo / son.html . Sarà necessario utilizzare che per tutti i comandi.

Se non funziona ancora assicurarsi che si sta utilizzando la versione più recente del database come findandmodify è una nuova funzionalità.

Altri suggerimenti

Una soluzione potrebbe essere quella di realizzare la versione JavaScript del comando e passarlo al db.eval ().

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

Il problema è che, come detto Alex, dicts Python non hanno alcun ordine, quindi sarà necessario per creare la stringa più o meno manualmente.

Vedere la documentazione PyMongo:

  

Si noti l'ordine delle chiavi del documento di comando è significativo (il   “Verb” deve venire prima), quindi i comandi che richiedono più tasti (ad esempio   findandmodify) dovrebbe utilizzare un'istanza di figlio o una stringa e kwargs   invece di un dict Python.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top