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

发布于 2024-10-18 01:03:02 字数 320 浏览 2 评论 0原文

我正在通过 Python 对 MongoDB 运行更新。我有这一行:

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

但它会抛出此错误:

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

但是 True 对我来说看起来像是 bool 的实例!

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

I'm running an update on my MongoDB from Python. I have this line:

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

But it throws this error:

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

But True looks like an instance of bool to me!

How should I correctly write this update?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

∝单色的世界 2024-10-25 01:03:02

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

The third argument to PyMongo's update() is upsert and must be passed a boolean, not a dictionary. Change your code to:

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

Or pass upsert=True as a keyword argument:

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

Your mistake was likely caused by reading about update() in the MongoDB docs. 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.

樱花坊 2024-10-25 01:03:02

根据 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})

Or

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

是比仅仅传递 True 更好的方法,就像你希望的那样如果不保留参数的顺序,传递其他 kwargs 例如 safemulti 代码可能会中断。

According to http://api.mongodb.org/python/2.3/api/pymongo/collection.html#pymongo.collection.Collection.update you should indeed pass upsert as a keyword rather than just True, that is

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

Or

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

is a better approach than just passing True as if you ever wish to pass other kwargs such as safe or multi code might break if order of args is not kept.

帅的被狗咬 2024-10-25 01:03:02

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

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

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

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

upsert should be passed as either positional parameter, like so

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

or as a keyword argument, like so

self.word_counts[source].update(
    {'date':posttime},
    {"$inc" : words},
    upsert=True)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文