Insert python object in mongodb


Folks, I just spent a good amount of time trying to look this up -- I ought to be missing something basic.

I have a python object, all I want to do is to insert this object in mondodb.

This is what I have:

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): = link
        self.found = found
        self.expired = expired

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

throws this error:

Traceback (most recent call last):
  File "./", line 21, in <module>
  File "build/bdist.macosx-10.7-intel/egg/pymongo/", line 302, in insert
  File "build/bdist.macosx-10.7-intel/egg/pymongo/", line 252, in _fix_incoming
  File "build/bdist.macosx-10.7-intel/egg/pymongo/", line 73, in transform_incoming
TypeError: 'str' object does not support item assignment

Seems like it is because json.dumps() returns a string.

Now if I do do a loads of the value before inserting it works fine:

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

What is the most straight-forward to do this?


4/24/2012 5:54:36 AM

Accepted Answer

What is value in your initial code?

It should be dict not class instance

This should work:

4/24/2012 5:53:06 AM

You are misusing the insert method for the collection. Review here:

What you need to be inserting is a document. It should be a dict with keys and values. Simply trying to insert a string is not appropriate. json.dumps returns a string in json format. If you are just dumping it to get a dict then the json step is not necessary.

Insert exactly how your documents should look:


Or convert your class instance directly into the dict you want to store as a doc and then insert it. It works with your json.dumps.loads() because that ultimately does give you a dict.

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow