PyMongo upsert выбрасывает ошибку "upsert должен быть экземпляром 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 для меня!
Как правильно записать это обновление?
Ответы
Ответ 1
Третий аргумент 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. Версия JavaScript update
в качестве третьего аргумента принимает объект, содержащий необязательные параметры, такие как upsert
и multi
. Но поскольку Python позволяет передавать аргументы ключевого слова функции (в отличие от JavaScript, который имеет только позиционные аргументы), это необязательно, и PyMongo вместо этого использует эти параметры в качестве необязательных параметров функции.
Ответ 2
Согласно 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, как если бы вы когда-либо хотели передать другие kwargs, такие как safe
или multi
, код мог бы сломаться, если порядок аргументов не сохранился.
Ответ 3
upsert следует передавать как позиционный параметр, например
self.word_counts[source].update(
{'date':posttime},
{"$inc" : words},
True)
или как аргумент ключевого слова, например
self.word_counts[source].update(
{'date':posttime},
{"$inc" : words},
upsert=True)