2015-10-17 6 views
8

मैं पाइथन वेब एप्लिकेशन (पायमोंगो + बोतल) के लिए बैक-एंड डेटाबेस के रूप में मोंगोडीबी का उपयोग कर रहा हूं। उपयोगकर्ता अपलोड के दौरान फ़ाइलों को अपलोड कर सकते हैं और वैकल्पिक रूप से 'टैग' कर सकते हैं। टैग, दस्तावेज़ के भीतर एक सूची के रूप में जमा हो जाती नीचे प्रति:पुन: सम्मिलन के बिना प्योंमोन्गो में मोंगोडीबी दस्तावेज़ सरणी में आइटम संलग्न करें

{ 
    "_id" : ObjectId("561c199e038e42b10956e3fc"), 
    "tags" : [ "tag1", "tag2", "tag3" ], 
    "ref" : "4780" 
} 

मैं उपयोगकर्ताओं को किसी भी दस्तावेज़ के लिए नए टैग संलग्न करने के लिए अनुमति देने के लिए कोशिश कर रहा हूँ। मैं कुछ इस तरह के साथ आया था: (।। FYI; ref कुंजी हमेशा अद्वितीय है यह आसानी से _id रूप में अच्छी तरह से हो सकता है)

def update_tags(ref, new_tag) 
    # fetch desired document by ref key as dict 
    document = dict(coll.find_one({'ref': ref})) 
    # append new tag 
    document['tags'].append(new_tag) 
    # re-insert the document back into mongo 
    coll.update(document) 

ऐसा लगता है कि वहाँ सिर्फ 'टैग' मूल्य अपडेट करने का तरीका होना चाहिए सीधे पूरे दस्तावेज़ को वापस खींचकर और पुनः डालने के बिना। क्या मुझसे कोई चूक हो रही है?

किसी भी विचार बहुत सराहना कर रहे हैं :)

उत्तर

12

तुम बस $push ऑपरेटर के साथ .update विधि का उपयोग दस्तावेज़ पहले पुनः प्राप्त करने के उपयोग करने की आवश्यकता नहीं है।

def update_tags(ref, new_tag): 
    coll.update({'ref': ref}, {'$push': {'tags': new_tag}}) 

के बाद से अद्यतन बहिष्कृत हो गई है आप find_one_and_update या update_one विधि का उपयोग करना चाहिए अगर आप pymongo 2.9 या नए

+1

दोनों के बीच क्या अंतर है? बस वापसी मूल्य (दस्तावेज़ एक अद्यतनResult वस्तु बनाम)? आप एक या दूसरे का उपयोग कब करते हैं? – stackoverflowwww

+4

क्या होता है यदि 'टैग' फ़ील्ड मौजूद नहीं है? –

+0

यदि 'टैग' फ़ील्ड मौजूद नहीं है, तो यह बनाया गया है। @GauravOjha – styvane

0

बस को जोड़ने के लिए उपयोग कर रहे हैं जवाब @ssytvane के लिए, और @Guarav जवाब देने के लिए: आप जोड़ सकते हैं " Upsert यह सच है = "अगर यह मौजूद नहीं है:

def update_tags(ref, new_tag): 
    coll.update({'ref': ref}, {'$push': {'tags': new_tag}}, upsert = True) 

या

def update_tags(ref, new_tag): 
    coll.update_one({'ref': ref}, {'$push': {'tags': new_tag}}, upsert = True) 
+0

स्टैक ओवरफ़्लो पर योगदान के लिए धन्यवाद। कृपया ध्यान दें कि कोड-केवल उत्तर निराश हैं क्योंकि वे यह नहीं समझते कि वे इस मुद्दे को कैसे हल करते हैं। अन्य उत्तरों/टिप्पणियों का जिक्र करने के बजाय, यह समझाने के लिए अपना उत्तर अपडेट करने पर विचार करें कि यह क्या करता है और यह समस्या को कैसे संबोधित करता है, ताकि यह एक स्टैंडअलोन उत्तर हो, और फिर भी इस घटना में अर्थ हो कि अन्य उत्तर या टिप्पणी हटा दी जाती है। – FluffyKitten

1

आप बस कर सकते हैं

1) आप एकल प्रविष्टि संलग्न करना चाहते हैं, तो

def update_tags(ref, new_tag): 
    coll.update({'ref': ref}, {'$push': {'tags': new_tag}}) 

जैसे:

{ 
    "_id" : ObjectId("561c199e038e42b10956e3fc"), 
    "tags" : [ "tag1", "tag2", "tag3" ], 
    "ref" : "4780" 
} 
>> update_tags("4780", "tag4") 
{'updatedExisting': True, u'nModified': 1, u'ok': 1, u'n': 1} 
>> coll.find_one({"ref":"4780"}) 
{ 
    "_id" : ObjectId("561c199e038e42b10956e3fc"), 
    "tags" : [ "tag1", "tag2", "tag3" , "tag4" ], 
    "ref" : "4780" 
} 

2) आप कई प्रविष्टियाँ

def update_tags(ref, new_tag): 
    coll.update({'ref': ref}, {'$pushAll': {'tags': new_tag}}) #type of new_tag is list 

संलग्न करना चाहते हैं उदाहरण:

{ 
    "_id" : ObjectId("561c199e038e42b10956e3fc"), 
    "tags" : [ "tag1", "tag2", "tag3" ], 
    "ref" : "4780" 
} 
>> update_tags("4780", ["tag5", "tag6", "tag7"]) 
{'updatedExisting': True, u'nModified': 1, u'ok': 1, u'n': 1} 
>> coll.find_one({"ref":"4780"}) 
{ 
    "_id" : ObjectId("561c199e038e42b10956e3fc"), 
    "tags" : [ "tag1", "tag2", "tag3" , "tag4" , "tag5", "tag6", "tag7" ], 
    "ref" : "4780" 
} 

नोट: यदि कुंजी पहले से मौजूद नहीं है, तो mongo नई कुंजी बनाएगा।

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