我正在使用Python运行MongoDB的更新。我有这条线:
self.word_counts[source].update({'date':posttime},{"$inc" : words},{'upsert':True})
但它引发了这个错误:
raise TypeError("upsert must be an instance of bool")
但是True
看起来像是bool的一个例子!
如何正确撰写此更新?
答案 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版本将对象作为其第三个参数,其中包含upsert
和multi
等可选参数。但是由于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一样,如safe
或multi
代码可能会因为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)