2012-04-24 5 views
5

Люди, Я просто потратил много времени, пытаясь разобраться в этом - я должен упустить что-то основное.Вставить объект python в mongodb

У меня есть объект python, все, что я хочу сделать, это вставить этот объект в mondodb.

Это то, что у меня есть:

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) 

выдает эту ошибку:

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 

Похоже, это происходит потому, что json.dumps() возвращает строку.

Теперь, если я делать нагрузки значения перед установкой он работает отлично:

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

Самый прямолинейный, чтобы сделать это?

Спасибо!

ответ

10

Что такое value в вашем исходном коде?

Это должно быть dict не экземпляр класса

Это должно работать:

postings.insert(posting.__dict__) 
+1

Извините, я понял, что пропустил там линию, просто отредактировал вопрос. – helpmelearn

+0

Но в чем смысл использования класса 'Posting'? – San4ez

+0

Боже, это правильно. Спасибо, чувствуй себя глупо, что пропустил что-то такое глупое. – helpmelearn

2

Вы злоупотребляете метод вставки для сбора. Отзыв здесь: http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.insert

Что нужно, чтобы вставить документ. Это должен быть ключ с ключами и значениями. Просто попытка вставить строку не подходит. json.dumps возвращает строку в формате json. Если вы просто сбрасываете его, чтобы получить dict, то шаг json не нужен.

Вставка точно, как ваши документы должны выглядеть:

postings.insert ({ «ключ»: «значение»})

Или преобразовать экземпляр класса непосредственно в Словаре вы хотите сохранить как документ а затем вставьте его. Он работает с вашим json.dumps.loads(), потому что это в конечном итоге дает вам диктовку.

Смежные вопросы