PyMongo вставки бросает "вставки должен быть экземпляром типа bool" ошибка
я запускаю обновление на моем MongoDB от Python. У меня есть такая строчка:
self.word_counts[source].update({'date':posttime},{"$inc" : words},{'upsert':True})
но он выдает эту ошибку:
raise TypeError("upsert must be an instance of bool")
но True похоже на экземпляр bool для меня!
как я должен правильно написать это обновление?
3 ответов:
третий аргумент PyMongo это
update()иupsertи должен быть передан логический, а не словарь. Измените свой код на:self.word_counts[source].update({'date':posttime}, {"$inc" : words}, True)и передать
upsert=Trueв качестве ключевого аргумента:self.word_counts[source].update({'date':posttime}, {"$inc" : words}, upsert=True)ваша ошибка, вероятно, была вызвана чтением о
update()на MongoDB docs. Версия JavaScriptupdateпринимает объект в качестве третьего аргумента, содержащего необязательные параметры, такие какupsertиmulti. Но так как Python позволяет передача аргументов ключевых слов в функцию (в отличие от JavaScript, который имеет только позиционные аргументы), это не нужно, и PyMongo принимает эти параметры в качестве необязательных параметров функции.
согласно http://api.mongodb.org/python/2.3/api/pymongo/collection.html#pymongo.collection.Collection.update вы действительно должны передать upsert как ключевое слово, а не просто True, то есть
self.word_counts[source].update({'date':posttime},{"$inc" : words},**{'upsert':True})или
self.word_counts[source].update({'date':posttime},{"$inc" : words},upsert=True)это лучший подход, чем просто передача True, как если бы вы когда-нибудь хотели передать другие кварги, такие как
safeилиmultiкод может сломаться, если порядок args не сохраняется.
upsert должен передаваться как позиционный параметр, например
self.word_counts[source].update( {'date':posttime}, {"$inc" : words}, True)или в качестве аргумента, вот так
self.word_counts[source].update( {'date':posttime}, {"$inc" : words}, upsert=True)
Comments