PyMongo upsert引发“ upsert必须是bool的实例”错误


72

我正在从Python在MongoDB上运行更新。我有这条线:

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

但这会引发此错误:

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

但是True对我来说似乎是个笨蛋!

我应该如何正确编写此更新?

Answers:


112

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将对象作为第三个参数,其中包含可选参数,例如upsertmulti。但是由于Python允许将关键字参数传递给函数(与仅具有位置参数的JavaScript不同),因此这是不必要的,PyMongo会将这些选项用作可选的函数参数。


谢谢,显然我正在研究的示例是错误的。
ComputationalSocialScience

db。<collection_name> .update({<filters>},{<update_value>},upsert = False)pymongo版本= pymongo == 3.11.0这对我来说是
有用的

16

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


4

upsert应该作为位置参数传递,就像这样

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

或作为关键字参数,例如

self.word_counts[source].update(
    {'date':posttime},
    {"$inc" : words},
    upsert=True)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.