2015-03-11 6 views
38

Folgen Sie entlang der PyMongo tutorial und bekomme einen Fehler beim Aufruf der insert_one Methode auf einer Sammlung.Sammlung Objekt ist nicht aufrufbar Fehler mit PyMongo

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. 

Es gibt ein paar Beiträge online, die diesen Fehler diskutieren, aber alle scheinen zu sein, wenn der Benutzer einen veralteten Namen ruft.

Irgendwelche Hinweise, was ich hier falsch mache?

+0

Ich möchte nur hinzufügen, dass dies ein Beispiel dafür ist, was hier ein "klares" Beispiel genannt wird. Diese Überwachung würde diesem Beispiel gut folgen. –

+0

Das ist mir auch gerade passiert. Danke fürs Posten =). – rockerBOO

Antwort

48

Es ist eine klare Frage, aber das Problem scheint hier zu sein, dass Sie von der "beta" Release-Dokumentation lesen, aber aller Wahrscheinlichkeit Sie tatsächlich höchstens haben „pymongo“ 2.8 installiert anstatt die „3.0b“ bezeichnet zu dem Link, den du zitierst.

Die 2.8 release tutorial verweist auf die .insert() Methode statt:

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

Seit .insert_one() ist nur im 3.0b-Treiber zur Verfügung.

Erzwingen Sie entweder die Installation des "Beta" -Treibers oder leben Sie mit einem stabilen Treiber und den verfügbaren Methoden.

Dies scheint der Fehler der aktuellen "Suchmaschinen-Antwort" zu sein, die die "Beta-Version" als "aktuell" entspricht.

+2

Ha das war es, danke Kumpel. Drei Stunden komme ich nie wieder ... –

+1

@ strimp099 Nicht wirklich deine Schuld. Fühle deinen Schmerz. Dies ist nur ein "Nebenprodukt" von Änderungen, die im Zusammenhang mit der aktuellen Version von MongoDB 3.0 herausgegeben wurden. Treiber ändern sich, um sicherzustellen, dass sie mithalten. Im Speziellen geht es darum, das [Bulk-Operations-API] (http://docs.mongodb.org/manual/reference/method/Bulk/) mit spezifischen Methoden zu verwenden. –

15

Das Problem ist, dass Sie das Tutorial aus der aktuellen Release-Dokumentation folgen, aber PyMongo 2.8 installiert haben.

Die Methode insert_one() ist neu in PyMongo 3.0 jetzt rückportiert in PyMongo 2.9. Daher müssen Sie PyMongo 2.9 oder eine neuere Version installieren, um die neue API-Funktion nutzen zu können.

Sie können Ihren Treiber mit pip like installieren oder aktualisieren.

python -m pip install -U pymongo 
1

Ich hatte auch das gleiche Problem. Als ich versuchte, meine PyMongo Verteilung Upgrade mit dem Befehl,

pip install -U pymongo 

bekam ich folgende Fehlermeldung:

error: could not create '/usr/local/lib/python2.7/dist-packages/pymongo': Permission denied

Offenbar auf meiner Distro, das Installationsprogramm nicht in der Lage war, eine Bibliothek im dist erstellen -Pakete Ordner wegen unzureichender Berechtigungen. Also, ich löste das Problem, indem Gewährung Berechtigungen schreiben und Neuinstallation des PyMongo Treiber:

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

Hoffnung, das hilft.

Verwandte Themen