2012-04-24 10 views
5

में पाइथन ऑब्जेक्ट डालें दोस्तों, मैंने इसे देखने की कोशिश करने में काफी समय बिताया - मुझे कुछ बुनियादी याद आना चाहिए।mongodb

मेरे पास एक पाइथन ऑब्जेक्ट है, मैं बस इतना करना चाहता हूं कि इस ऑब्जेक्ट को मॉन्डोड में डालें।

यह है कि मैं क्या है:

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

लेकिन 'पोस्टिंग' कक्षा का उपयोग करने में क्या बात है? – San4ez

+0

जीज़, यह सही है। धन्यवाद, मूर्खतापूर्ण महसूस करें कि कुछ मूर्खतापूर्ण है। – helpmelearn

2

आप संग्रह के लिए डालने विधि का दुरुपयोग कर रहे हैं। यहां समीक्षा करें: http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.insert

आपको जो डालने की आवश्यकता है वह एक दस्तावेज़ है। यह कुंजी और मूल्यों के साथ एक dict होना चाहिए। बस एक स्ट्रिंग डालने का प्रयास उचित नहीं है। json.dumps जेसन प्रारूप में एक स्ट्रिंग देता है। यदि आप इसे एक ताना प्राप्त करने के लिए बस डंप कर रहे हैं तो जेसन कदम आवश्यक नहीं है।

सम्मिलित वास्तव में कैसे अपने दस्तावेज़ों दिखना चाहिए:

postings.insert ({ "कुंजी": "मूल्य"})

या सीधे dict आप किसी दस्तावेज़ के रूप में संग्रहीत करना चाहते हैं में अपने वर्ग उदाहरण कन्वर्ट और फिर इसे सम्मिलित करें। यह आपके json.dumps.loads() के साथ काम करता है क्योंकि अंततः आपको एक निर्देश देता है।