2012-04-24 30 views
5

Gente, Acabo de pasar una buena cantidad de tiempo intentando buscar esto - Debería perderme algo básico.Insertar objeto python en mongodb

Tengo un objeto python, todo lo que quiero hacer es insertar este objeto en mondodb.

Esto es lo que tengo:

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) 

tiros este error:

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 

Parece que se debe a json.dumps() devuelve una cadena.

Ahora bien, si yo hago un montón de valor antes de insertarlo funciona bien:

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

Qué es lo más recta hacia adelante para hacer esto?

Gracias!

Respuesta

10

¿Qué es value en el código inicial?

Debe ser dict no instancia de clase

esto debería funcionar:

postings.insert(posting.__dict__) 
+1

Lo siento, me di cuenta de que me perdí una línea allí, solo edité la pregunta. – helpmelearn

+0

¿Pero de qué sirve usar la clase 'Posting'? – San4ez

+0

Por Dios, eso es correcto. Gracias, se siente estúpido por haber perdido algo tan tonto. – helpmelearn

2

Se están haciendo mal uso del método de inserción para la colección. Revise aquí: http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.insert

Lo que necesita insertar es un documento. Debería ser un dict con claves y valores. Simplemente tratar de insertar una cadena no es apropiado. json.dumps devuelve una cadena en formato json. Si solo lo está descargando para obtener un dict entonces el paso json no es necesario.

Insertar exactamente cómo sus documentos deben buscar:

postings.insert ({ "clave": "valor"})

o convertir su instancia de clase directamente en el dict desea guardar como un documento y luego insertarlo. Funciona con su json.dumps.loads() porque finalmente le da un dict.

Cuestiones relacionadas