2012-04-24 13 views
5

Gente, Ho appena trascorso una buona quantità di tempo cercando di cercare questo - mi dovrebbe mancare qualcosa di base.Inserisci oggetto python in mongodb

Ho un oggetto Python, tutto quello che voglio fare è inserire questo oggetto in mondodb.

Questo è quello che ho:

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) 

tiri questo errore:

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 

Sembra che sia perché json.dumps() restituisce una stringa.

Ora, se io faccio un sacco di valore prima di inserirla funziona bene:

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

Qual è la straight-forward più per fare questo?

Grazie!

risposta

10

Che cos'è value nel codice iniziale?

Dovrebbe essere dict non classe esempio

questo dovrebbe funzionare:

postings.insert(posting.__dict__) 
+1

Scusa mi sono reso conto di essermi perso una riga, ho appena modificato la domanda. – helpmelearn

+0

Ma che senso ha usare la classe "Posting"? – San4ez

+0

Cribbio, è vero. Grazie, sentiti stupido di aver perso qualcosa di così sciocco. – helpmelearn

2

Si sono utilizzati da metodo di inserimento per la raccolta. Recensione: http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.insert

Ciò che è necessario inserire è un documento. Dovrebbe essere un ditt con chiavi e valori. Il semplice tentativo di inserire una stringa non è appropriato. json.dumps restituisce una stringa in formato json. Se lo stai solo scaricando per ottenere un ditt, allora il passaggio di Jones non è necessario.

Inserire esattamente come i documenti dovrebbero guardare:

postings.insert ({ "chiave": "valore"})

O convertire l'istanza della classe direttamente nel dict che si desidera memorizzare come doc e quindi inserirlo. Funziona con il tuo json.dumps.loads() perché in definitiva ti dà un dettato.

Problemi correlati