PyMongo upsert 抛出“ upsert must be an instance of bool”错误

我正在运行来自 Python 的 MongoDB 更新,我有这样一行代码:

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

但它抛出了这样一个错误:

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

但是 True对我来说就像一个 bool 的实例!

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

57365 次浏览

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)

Your mistake was likely caused by reading about update() in the MongoDB 文档. The JavaScript version of update takes an object as its third argument containing optional parameters like upsert and multi. But since Python allows passing keyword arguments to a function (unlike JavaScript which only has positional arguments), this is unnecessary and PyMongo takes these options as optional function parameters instead.

根据 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代码,如果没有保持参数的顺序,则可能会中断。

Upsert 应该作为位置参数传递,如下所示

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

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

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