Python / Dictionary / List / Mongo insert issues - beginner
Question: Sorry, trying to understand and get used to dictionary and list objects.

I'm calling eBay's API through their ebaysdk, and want to store the items from
it to a collection as documents in Mongo. Simple.

Here's a sample of the schema that will be returned:

    
    
    <timestamp>2009-09-04T00:47:12.456Z</timestamp>
      <searchResult count="2">
      <item>
         <itemId>230371938681</itemId>
         <title>Harry Potter and the Order of the Phoenix HD-DVD</title>
         <globalId>EBAY-US</globalId>
         <primaryCategory>
            <categoryId>617</categoryId>
            <categoryName>DVD, HD DVD & Blu-ray</categoryName>
         </primaryCategory>
    

I've tried 500 iterations of this code, stripped down to the most basic here's
what I have.

    
    
    from ebaysdk import finding
    from pymongo import MongoClient
    
    api = finding(appid="billy-40d0a7e49d87")
    api.execute('findItemsByKeywords', {'keywords': 'potter'})
    listings = api.response_dict()
    
    client = MongoClient('mongodb://user:pass@billy.mongohq.com:10099/ebaystuff')
    db = client['ebaycollection']
    ebay_collection = db.ebaysearch
    
    for key in listings:
      print key
      ebay_collection.insert(key)
    

Will get this error:

    
    
    Traceback (most recent call last):
      File "ebay_search.py", line 34, in <module>
        ebay_collection.insert(key)
      File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 408, in insert
        self.uuid_subtype, client)
      File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 378, in gen
        doc['_id'] = ObjectId()
    TypeError: 'str' object does not support item assignment
    

Simple stuff. All I want to do is add each item as a document.


Answer: An immutable type like a string cannot be used as a document because it
doesn't allow adding additional fields, like the [`_id` field Mongo
requires](http://docs.mongodb.org/manual/reference/method/db.collection.insert/#id-
field). You can instead wrap the string in a dictionary to serve as a wrapper
document:

    
    
    key_doc = {'key': key}
    ebay_collection.insert(key_doc)
    

