集合对象不是 PyMongo 的可调用错误

Posted

技术标签:

【中文标题】集合对象不是 PyMongo 的可调用错误【英文标题】:Collection object is not callable error with PyMongo 【发布时间】:2015-05-12 22:52:50 【问题描述】:

跟随 PyMongo tutorial 并在集合上调用 insert_one 方法时遇到错误。

In [1]: import pymongo

In [2]: from pymongo import MongoClient

In [3]: client = MongoClient()

In [4]: db = client.new_db

In [5]: db
Out[5]: Database(MongoClient('localhost', 27017), u'new_db')

In [6]: posts = db.posts

In [7]: posts.insert_one('a':1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-2271c01f9a85> in <module>()
----> 1 posts.insert_one('a':1)

C:\Anaconda\lib\site-packages\pymongo-2.8-py2.7-win32.egg\pymongo\collection.py in __call__(self, *a
rgs, **kwargs)
   1771                         "call the '%s' method on a 'Collection' object it is "
   1772                         "failing because no such method exists." %
-> 1773                         self.__name.split(".")[-1])

TypeError: 'Collection' object is not callable. If you meant to call the 'insert_one' method on a 'Collection' object it is failing because no such method exists.

网上有一些帖子讨论了这个错误,但似乎都是当用户调用一个已弃用的名称时。

关于我在这里做错了什么的任何指导?

【问题讨论】:

我想补充一点,这是这里所谓的“清晰”示例的示例。这些监控会很好地效仿。 这也发生在我身上。感谢您发布 =)。 【参考方案1】:

问题是您正在按照当前版本文档中的教程进行操作,但实际上安装了 PyMongo 2.8。

insert_one() 方法是 PyMongo 3.0 中的新方法,现在在 PyMongo 2.9 中反向移植。很明显,您需要安装 PyMongo 2.9 或更新版本才能使用新的 API 功能。

您可以使用pip like 来安装或升级您的驱动程序。

python -m pip install -U pymongo

【讨论】:

【参考方案2】:

我也遇到了同样的问题。当我尝试使用命令升级我的 PyMongo 发行版时,

pip install -U pymongo

我收到以下错误:

错误:无法创建“/usr/local/lib/python2.7/dist-packages/pymongo”:权限被拒绝

显然,在我的发行版上,由于权限不足,安装程序无法在 dist-packages 文件夹中创建库。所以,我通过授予它写权限并重新安装 PyMongo 驱动程序解决了这个问题:

cd /usr/local/lib/python2.7/
sudo chmod 0777 dist-packages
pip install -U pymongo

希望这会有所帮助。

【讨论】:

您不应更改这些权限,而应使用sudo -H pip install -U pymongopip install --user -U pymongo 如果您以管理员身份安装,可能还需要在 Windows 中以管理员身份运行 pip。【参考方案3】:

这是一个明确的问题,但这里的问题似乎是您正在阅读"beta" 发布文档,但很可能您实际上最多安装了“pymongo”2.8,而不是中提到的“3.0b”您引用的链接。

2.8 release tutorial 指向 .insert() 方法:

posts.insert('a':1)

由于.insert_one() 仅在 3.0b 驱动程序中可用。

要么强制安装“测试版”驱动程序,要么使用稳定的驱动程序和可用的方法。

这似乎是当前“搜索引擎响应”将“测试版”匹配为“当前”的错误。

【讨论】:

@strimp099 真的不是你的错。感受你的痛苦。这只是围绕最近的 MongoDB 3.0 版本发布的更改的“副产品”。司机正在改变以确保他们跟上。具体来说,这就是将Bulk Operations API 与特定方法一起使用。 好吧,我有 pymongo 3.7,但仍然收到相同的错误消息。使用 insert 而不是 insert_one 没有帮助。

以上是关于集合对象不是 PyMongo 的可调用错误的主要内容,如果未能解决你的问题,请参考以下文章

的Python:什么“类型错误‘xxx’的对象不是可调用”的意思?

pymongo 错误文档必须是 dict 的实例

查明 C++ 对象是不是可调用

pymongo 集合对象序列化 __getnewargs__ 方法

在 HTTPS 可调用的 Firebase Cloud Functions 中,错误代码的名称是不是在 iOS 中可用?

Gunicorn“应用程序对象必须是可调用的”错误