我正在从Python在MongoDB上运行更新。我有这条线:
self.word_counts[source].update({'date':posttime},{"$inc" : words},{'upsert':True})
但这会引发此错误:
raise TypeError("upsert must be an instance of bool")
但是True
对我来说似乎是个笨蛋!
我应该如何正确编写此更新?
Answers:
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会将这些选项用作可选的函数参数。
根据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)
不仅仅是传递真,如果你曾经希望通过其他kwargs,如更好的方法safe
或multi
如果参数的个数顺序没有保持代码可能会中断。