วัตถุคอลเลกชันไม่ใช่ข้อผิดพลาดที่สามารถเรียกได้กับ PyMongo

ปฏิบัติตาม บทช่วยสอน ของ PyMongo และได้รับข้อผิดพลาดเมื่อเรียกใช้เมธอด 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.

มีโพสต์ออนไลน์บางส่วนที่กล่าวถึงข้อผิดพลาดนี้ แต่ดูเหมือนว่าจะเกิดขึ้นเมื่อผู้ใช้เรียกชื่อที่เลิกใช้แล้ว

คำแนะนำเกี่ยวกับสิ่งที่ฉันทำผิดที่นี่?


person Jason Strimpel    schedule 11.03.2015    source แหล่งที่มา
comment
ฉันแค่อยากจะเสริมว่านี่คือตัวอย่างของสิ่งที่เรียกว่าเป็นตัวอย่างที่ชัดเจน การติดตามผลเหล่านั้นควรปฏิบัติตามตัวอย่าง   -  person Neil Lunn    schedule 11.03.2015
comment
เรื่องนี้เพิ่งเกิดขึ้นกับฉันเช่นกัน ขอบคุณสำหรับการโพสต์ =)   -  person rockerBOO    schedule 21.03.2015


คำตอบ (3)


เป็นคำถามที่ชัดเจน แต่ปัญหาที่นี่ดูเหมือนว่าคุณกำลังอ่านจากรุ่น "beta" เอกสารประกอบ แต่เป็นไปได้ว่าคุณน่าจะติดตั้ง "pymongo" 2.8 ไว้มากกว่า "3.0b" ที่อ้างถึงในลิงก์ที่คุณเสนอราคา

บทแนะนำรุ่น 2.8 ชี้ไปที่ .insert() วิธีการแทน:

posts.insert({'a':1})

เนื่องจาก .insert_one() มีเฉพาะในไดรเวอร์ 3.0b เท่านั้น .

บังคับให้ติดตั้งไดรเวอร์ "เบต้า" หรือใช้ไดรเวอร์ที่เสถียรและวิธีการที่มีอยู่

นี่ดูเหมือนจะเป็นความผิดของ "การตอบสนองของเครื่องมือค้นหา" ในปัจจุบันที่ตรงกับ "รุ่นเบต้า" เป็น "ปัจจุบัน"

person Neil Lunn    schedule 11.03.2015
comment
@ stripp099 ไม่ใช่ความผิดของคุณจริงๆ รู้สึกถึงความเจ็บปวดของคุณ นี่เป็นเพียงผลพลอยได้จากการเปลี่ยนแปลงที่เกิดขึ้นใน MongoDB 3.0 รุ่นล่าสุด ไดรเวอร์กำลังเปลี่ยนแปลงเพื่อให้แน่ใจว่าตามทัน โดยเฉพาะอย่างยิ่งทั้งหมดนี้เกี่ยวกับการใช้ Bulk Operations API ด้วยวิธีการเฉพาะ - person Neil Lunn; 11.03.2015
comment
ฉันมี pymongo 3.7 และยังคงได้รับข้อความแสดงข้อผิดพลาดเดียวกัน การใช้ insert แทน insert_one ไม่ได้ช่วยอะไร - person Philipp Ludwig; 10.12.2020

ปัญหาคือคุณกำลังติดตามบทช่วยสอนจากเอกสารประกอบรุ่นปัจจุบัน แต่จริงๆ แล้วได้ติดตั้ง PyMongo 2.8 แล้ว

เมธอด insert_one() เป็นเมธอดใหม่ ใน PyMongo 3.0 ขณะนี้มีแบ็คพอร์ตใน PyMongo 2.9< /ก>. เห็นได้ชัดว่าคุณจะต้องติดตั้ง PyMongo 2.9 หรือเวอร์ชันใหม่กว่าเพื่อใช้ฟีเจอร์ API ใหม่

คุณสามารถติดตั้งหรืออัปเกรดไดรเวอร์ของคุณโดยใช้ pip like

python -m pip install -U pymongo
person styvane    schedule 11.03.2015

ฉันก็ประสบปัญหาเดียวกันเช่นกัน เมื่อฉันลองอัพเกรดการกระจาย PyMongo โดยใช้คำสั่ง

pip install -U pymongo

ฉันได้รับข้อผิดพลาดดังต่อไปนี้:

ข้อผิดพลาด: ไม่สามารถสร้าง '/usr/local/lib/python2.7/dist-packages/pymongo': การอนุญาตถูกปฏิเสธ

เห็นได้ชัดว่าใน distro ของฉัน ตัวติดตั้งไม่สามารถสร้างไลบรารีในโฟลเดอร์ dist-packages ได้เนื่องจากสิทธิ์อนุญาตไม่เพียงพอ ดังนั้นฉันจึงแก้ไขปัญหาโดยให้สิทธิ์ในการเขียนและติดตั้งไดรเวอร์ PyMongo อีกครั้ง:

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

หวังว่านี่จะช่วยได้

person Siddharth Karnam    schedule 12.10.2015
comment
คุณไม่ควรเปลี่ยนการอนุญาตเหล่านี้ แต่ใช้ sudo -H pip install -U pymongo หรือ pip install --user -U pymongo - person PvdL; 19.07.2018
comment
คุณอาจต้องเรียกใช้ pip ในฐานะผู้ดูแลระบบใน Windows หากคุณติดตั้งเป็นผู้ดูแลระบบ - person Allan Elder; 02.08.2018