pymongo: findandmodify - “tale comando” viene restituito
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?
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
corrente api pymongo ha find_and_modify built-in vedere di più al https://github.com/ MongoDB / mongo-python-pilota / blob / master / pymongo / collection.py # L1035
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