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 для меня!



как я должен правильно написать это обновление?

610   3  

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. Версия JavaScript update принимает объект в качестве третьего аргумента, содержащего необязательные параметры, такие как 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

    Ничего не найдено.