J'exécute une mise à jour sur mon MongoDB à partir de Python. J'ai cette ligne:
self.Word_counts[source].update({'date':posttime},{"$inc" : words},{'upsert':True})
Mais il jette cette erreur:
raise TypeError("upsert must be an instance of bool")
Mais True
ressemble à une instance de bool pour moi!
Comment dois-je écrire correctement cette mise à jour?
Le troisième argument de PyMongo update()
est upsert
et doit être passé un booléen, pas un dictionnaire. Changez votre code pour:
self.Word_counts[source].update({'date':posttime}, {"$inc" : words}, True)
Ou passez upsert=True
Comme argument de mot clé:
self.Word_counts[source].update({'date':posttime}, {"$inc" : words}, upsert=True)
Votre erreur a probablement été causée par la lecture de update()
dans le MongoDB docs . La version JavaScript de update
prend un objet comme troisième argument contenant des paramètres facultatifs comme upsert
et multi
. Mais puisque Python permet de passer des arguments de mots clés à une fonction (contrairement à JavaScript qui n'a que des arguments de position), cela n'est pas nécessaire et PyMongo prend ces options comme paramètres de fonction facultatifs à la place.
Selon http://api.mongodb.org/python/2.3/api/pymongo/collection.html#pymongo.collection.Collection.update vous devez en effet passer upsert en tant que mot-clé plutôt que simplement True , C'est
self.Word_counts[source].update({'date':posttime},{"$inc" : words},**{'upsert':True})
Ou
self.Word_counts[source].update({'date':posttime},{"$inc" : words},upsert=True)
est une meilleure approche que de simplement passer True comme si vous souhaitiez passer d'autres kwargs tels que safe
ou multi
le code pourrait casser si l'ordre des arguments n'est pas conservé.
upsert doit être passé comme paramètre de position, comme tel
self.Word_counts[source].update(
{'date':posttime},
{"$inc" : words},
True)
ou comme argument de mot-clé, comme ça
self.Word_counts[source].update(
{'date':posttime},
{"$inc" : words},
upsert=True)