2012-04-24 60 views
5

Folks, 我只是花了很多时间试图查看这个 - 我应该缺少一些基本的东西。在mongodb中插入python对象

我有一个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 2012-04-24 05:55:20

+0

但是使用'Posting'类有什么意义? – San4ez 2012-04-24 05:57:56

+0

Jeez,没错。谢谢,感到愚蠢的错过了一些如此愚蠢的事情。 – helpmelearn 2012-04-24 05:57:58

2

你滥用为集合插入方法。这里检查:http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.insert

你需要插入的是一个文件。它应该是一个带有键和值的字典。简单地尝试插入一个字符串是不合适的。 json.dumps以json格式返回一个字符串。如果你只是倾销它得到一个字典,那么json步骤是没有必要的。

插入正是你的文件应该是什么样子:

postings.insert({“关键”:“值”})

或者直接将您的类实例为您希望保存为一个文档的字典然后插入它。它与你的json.dumps.loads()一起工作,因为它最终会给你一个字典。