2012-04-24 13 views
5

Ludzie, Po prostu spędziłem dużo czasu, próbując to sprawdzić - powinienem brakować czegoś podstawowego.Wstaw obiekt python w mongodb

Mam obiekt Pythona, wszystko co chcę zrobić to wstawić ten obiekt w mondodb.

To jest to, co mam:

from pymongo import Connection 
import json 

conn = Connection() 
db = conn.cl_database 
postings = db.postings_collection 

class Posting(object): 
    def __init__(self, link, found=None, expired=None): 
     self.link = link 
     self.found = found 
     self.expired = expired 

posting = Posting('objectlink1') 
value = json.dumps(posting, default=lambda x:x.__dict__) 
postings.insert(value) 

rzuca ten błąd:

Traceback (most recent call last): 
    File "./mongotry.py", line 21, in <module> 
postings.insert(value) 
    File "build/bdist.macosx-10.7-intel/egg/pymongo/collection.py", line 302, in insert 
    File "build/bdist.macosx-10.7-intel/egg/pymongo/database.py", line 252, in _fix_incoming 
    File "build/bdist.macosx-10.7-intel/egg/pymongo/son_manipulator.py", line 73, in transform_incoming 
TypeError: 'str' object does not support item assignment 

Wydaje się to dlatego json.dumps() zwraca ciąg znaków.

Teraz gdybym rób mnóstwo wartości przed włożeniem to działa dobrze:

posting = Posting('objectlink1') 
value = json.dumps(posting, default=lambda x:x.__dict__) 
value = json.loads(value) 
postings.insert(value) 

Co jest najbardziej prosta to zrobić?

Dzięki!

Odpowiedz

10

Co jest value w początkowej kodu?

To nie powinno być dict klasa instancji

To powinno działać:

postings.insert(posting.__dict__) 
+1

Przepraszam, że zdałem sobie sprawę, że przegapiłem linię, właśnie zredagowałem pytanie. – helpmelearn

+0

Ale jaki jest sens używania klasy 'Posting'? – San4ez

+0

Jezu, to prawda. Dzięki, czuję się głupio, że przegapiłem coś tak głupiego. – helpmelearn

2

Jesteś nadużywania metodę insert do kolekcji. Sprawdź tutaj: http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.insert

Co trzeba być wstawienie jest dokumentem. Powinien to być dyktat z kluczami i wartościami. Po prostu próba wstawienia ciągu nie jest właściwa. json.dumps zwraca ciąg znaków w formacie json. Jeśli tylko dumping go dostać dict następnie etap json nie jest konieczne.

Włóż dokładnie tak, jak powinny wyglądać dokumenty:

postings.insert ({ „klucza”: „wartość”})

Albo zamienić instancję klasy bezpośrednio do dict chcesz zapisać jako doc a następnie włóż to. Działa ze swoimi json.dumps.loads() dlatego, że ostatecznie nie daje dict.

Powiązane problemy