2012-09-10 11 views
16

मैं मोंगोडीबी और फ्लास्क (पिमोंगो ड्राइवर का उपयोग करके) का उपयोग करके एक वेब सेवा बनाने का प्रयास कर रहा हूं। डेटाबेस के लिए एक क्वेरी निश्चित रूप से "_id" फ़ील्ड के साथ दस्तावेज़ लौटाती है। मैं इसे क्लाइंट को नहीं भेजना चाहता, तो मैं इसे कैसे हटा सकता हूं?Pymongo से _id तत्व को हटाने के परिणाम

@app.route('/theobjects') 
def index(): 
    objects = db.collection.find() 
    return str(json.dumps({'results': list(objects)}, 
     default = json_util.default, 
     indent = 4)) 

यह रिटर्न:

{ 
"results": [ 
    { 
     "whatever": { 
      "field1": "value", 
      "field2": "value", 
     }, 
     "whatever2": { 
      "field3": "value" 
     }, 
     ... 
     "_id": { 
      "$oid": "..." 
     }, 

    ... 
    } 
]} 

मैंने सोचा कि यह एक शब्दकोश था और मैं बस इसे लौटने से पहले तत्व हटा सकता है:

del objects['_id'] 

यहाँ एक बोतल मार्ग है लेकिन यह एक टाइप एरर देता है:

TypeError: 'Cursor' object does not support item deletion 

तो यह एक शब्दकोश नहीं है, लेकिन मुझे एक शब्द के रूप में प्रत्येक परिणाम के साथ फिर से शुरू करना है। तो मुझे लगता है कि ऐसा करने के लिए इस कोड के साथ प्रयास करें:

for object in objects: 
    del object['_id'] 

प्रत्येक वस्तु शब्दकोश तरीका लग रहा है मैं यह करने के लिए अब चाहते हैं, लेकिन वस्तुओं कर्सर खाली है। तो मैं एक नया शब्दकोश बनाने के लिए कोशिश करते हैं और प्रत्येक से _ id को हटाने के बाद, एक नया शब्दकोश कि बोतल वापस आ जाएगी में जोड़ें:

new_object = {} 
for object in objects: 
    for key, item in objects.items(): 
     if key == '_id': 
      del object['_id'] 
      new_object.update(object) 

यह सिर्फ प्रथम स्तर चाबियाँ और कुछ नहीं के साथ एक शब्दकोश देता है।

तो यह एक मानक नेस्टेड शब्दकोश की समस्या है, लेकिन मुझे यह भी आश्चर्य हुआ कि मोंगोडीबी के पास आसानी से निपटने का कोई तरीका नहीं है।

MongoDB documentation बताते हैं कि आप

{ _id : 0 } 

साथ _ id बाहर कर सकते हैं लेकिन उस pymongo साथ कुछ नहीं करता है। Pymongo documentation बताता है कि आप उन फ़ील्ड को सूचीबद्ध कर सकते हैं जिन्हें आप लौटा चाहते हैं, लेकिन "(" _id "हमेशा शामिल किया जाएगा)"। गंभीरता से? क्या इसके चारों ओर कोई रास्ता नहीं है? क्या कोई सरल और बेवकूफ है कि मैं यहां देख रहा हूं?

+0

आपका वास्तविक दावा यहां क्या है? नया नियम बनाने के लिए आपका कोड अजीब और जरूरी नहीं है। आपकी असली समस्या क्या है? –

+0

मेरी समस्या यह थी कि .find ({}, {'_id': गलत}} ​​_id को छोड़ नहीं रहा था। हालांकि यह मेरे कोड के साथ एक समस्या थी और अब यह काम कर रहा है। आपकी सहायता के लिए धन्यवाद. – ddw

+0

"लेकिन ऑब्जेक्ट कर्सर खाली है": ऐसा इसलिए है क्योंकि आप केवल एक बार फिर से सक्रिय कर सकते हैं, इसलिए आपको फिर से प्रयास करना होगा, अगला निर्देश प्राप्त करना होगा, '_id' को हटाएं, एक सूची में dict डाल दें, और अंत में उस सूची को वापस न करें, न कि वस्तुओं। –

उत्तर

53

pymongo में एक खोज क्वेरी में _id क्षेत्र निकालने के लिए आपको उपयोग कर सकते हैं:

db.collection.find({}, {'_id': False}) 

प्रलेखन कुछ हद तक है इस पर मिस्लीडिंग के रूप में यह कहता है कि _id फ़ील्ड हमेशा शामिल है।लेकिन आप इसे ऊपर दिखाए गए जैसे बाहर कर सकते हैं।

+0

धन्यवाद, यह सही है। मैंने पोस्ट करने से पहले यह कोशिश की थी लेकिन मुझे लगता है कि पहले पैरामीटर में जिस स्ट्रिंग को मैं पास कर रहा था, उसमें कोई समस्या थी। मैंने तय किया और अब सब अच्छा है। – ddw

2

आप

del objects['_id'] 

कर्सर वस्तु पर बुला रहे हैं!

कर्सर ऑब्जेक्ट स्पष्ट रूप से परिणाम सेट पर एक पुनरावर्तनीय है और एकल दस्तावेज़ नहीं है जिसे आप कुशल बना सकते हैं।

for obj in objects: 
    del obj['_id'] 

संभवतः आप जो चाहते हैं उसकी संभावना है।

तो अपने दावे पूरी तरह से गलत रूप में निम्न कोड से पता चलता है:

import pymongo 

c = pymongo.Connection() 
db = c['mydb'] 
db.foo.remove({}) 
db.foo.save({'foo' : 42}) 

for row in db.foo.find(): 
    del row['_id'] 
    print row 



$ bin/python foo.py 

> {u'foo': 42} 
+0

हां, मैंने मूल रूप से पोस्ट करने से पहले भी आपके कोड को आजमाया। लेकिन फिर मैं इन घोंसला वाले शब्दकोशों को एक शब्दकोश में कैसे जोड़ूं जो क्लाइंट को पास किया जा सकता है? इसके अलावा, मुझे एहसास हुआ कि मैं एक कर्सर ऑब्जेक्ट पर डेल करने की कोशिश कर रहा था, इसलिए मैंने कहा "तो यह एक शब्दकोश नहीं है, लेकिन मुझे एक शब्द के रूप में प्रत्येक परिणाम के साथ फिर से शुरू करना है।" हो सकता है कि मुझे अपनी खोज प्रक्रिया छोड़ दी हो, लेकिन मैंने सोचा कि अधिक जानकारी बेहतर है। – ddw

संबंधित मुद्दे