2012-04-24 3 views
5

Folks, Je viens de passer un bon moment à chercher ça - il me manque quelque chose de basique.Insérer un objet python dans mongodb

J'ai un objet python, tout ce que je veux faire est d'insérer cet objet dans mondodb.

C'est ce que j'ai:

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) 

jette cette erreur:

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 

On dirait que c'est parce que json.dumps() retourne une chaîne.

Maintenant, si je fais une charge de la valeur avant de l'insérer fonctionne très bien:

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

Quel est le plus simple pour le faire?

Merci!

Répondre

10

Qu'est-ce que value dans votre code initial?

Il devrait être dict pas par exemple la classe

Cela devrait fonctionner:

postings.insert(posting.__dict__) 
+1

Désolé je me suis rendu compte que j'ai raté une ligne, juste édité la question. – helpmelearn

+0

Mais à quoi ça sert d'utiliser la classe 'Posting'? – San4ez

+0

Jeez, c'est vrai. Merci, sentez-vous stupide d'avoir manqué quelque chose d'aussi bête. – helpmelearn

2

Vous utilisent à mauvais escient la méthode d'insertion pour la collecte. Passer en revue ici: http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.insert

Ce que vous devez insérer est un document. Ce devrait être une dict avec des clés et des valeurs. Essayer simplement d'insérer une chaîne n'est pas approprié. json.dumps renvoie une chaîne au format json. Si vous ne faites que le jeter pour obtenir une dict, l'étape JSON n'est pas nécessaire.

Insérer exactement comment vos documents doivent regarder:

postings.insert ({ "clé": "valeur"})

Ou convertir votre instance de classe directement dans le dict que vous souhaitez enregistrer en tant que doc puis insérez-le. Cela fonctionne avec votre json.dumps.loads() car cela vous donne finalement un dict.

Questions connexes