PyMongo upsert抛出“upsert必须是bool的一个实例”错误

时间:2011-02-20 07:22:45

标签: python mongodb pymongo

我正在使用Python运行MongoDB的更新。我有这条线:

self.word_counts[source].update({'date':posttime},{"$inc" : words},{'upsert':True})

但它引发了这个错误:

raise TypeError("upsert must be an instance of bool")

但是True看起来像是bool的一个例子!

如何正确撰写此更新?

3 个答案:

答案 0 :(得分:96)

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)

您的错误可能是由MongoDB docs中的update()阅读引起的。 update的JavaScript版本将对象作为其第三个参数,其中包含upsertmulti等可选参数。但是由于Python允许将关键字参数传递给函数(与只有位置参数的JavaScript不同),这是不必要的,PyMongo将这些选项作为可选函数参数。

答案 1 :(得分:12)

根据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一样,如safemulti代码可能会因为args的顺序没有保留而中断。

答案 2 :(得分:3)

upsert应作为位置参数传递,如此

self.word_counts[source].update(
    {'date':posttime},
    {"$inc" : words},
    True)

或作为关键字参数,如此

self.word_counts[source].update(
    {'date':posttime},
    {"$inc" : words},
    upsert=True)