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

我从Python运行MongoDB的更新。 我有这条线:

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

但它会抛出这个错误:

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

但是True看起来就像是我的一个布尔实例!

我应该如何正确地写这个更新?

3 Solutions collect form web for “PyMongo upsert抛出“upsert必须是bool的一个实例”错误”

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文档中的update()而导致的。 update的JavaScript版本采用一个对象作为第三个参数,其中包含像upsertmulti这样的可选参数。 但是,由于Python允许将关键字parameter passing给一个函数(与只有位置参数的JavaScript不同),所以这是不必要的,PyMongo将这些选项作为可选的函数参数。

根据http://api.mongodb.org/python/2.3/api/pymongo/collection.html#pymongo.collection.Collection.update你应该确实传递upsert作为关键字,而不只是真正的,这是

 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的顺序不被保留的话。

upsert应该作为位置parameter passing,像这样

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

或者作为一个关键字参数,像这样

 self.word_counts[source].update( {'date':posttime}, {"$inc" : words}, upsert=True) 
  • 用一个空格replace非ASCII字符
  • 终止一个multithreading的python程序
  • 在单行命令行中执行Python多行语句
  • 为什么4 * 0.1的浮点值在Python 3中看起来不错,但是3 * 0.1却没有?
  • 发送包含embedded图像的多段html电子邮件
  • Python for循环中的循环计数器
  • 为什么“python setup.py sdist”在项目根目录下创build不需要的“PROJECT-egg.info”?
  • 你使用get / set模式(在Python中)?
  • 有没有办法在Python中使用PhantomJS?
  • time.sleep - 睡觉线程或进程?
  • 如何将pandas数据框中的date转换为“date”数据types?