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)