web-dev-qa-db-fra.com

PyMongo upsert lance l'erreur "upsert doit être une instance de bool"

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?

65

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.

98
Brendan W. McAdams

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é.

14
Tzury Bar Yochay

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)
4
Ramashish Baranwal