2012-07-07 9 views
40

मैं एक mongodb दस्तावेज़ में एक सरणी के भीतर निहित एकल उपखंड को अद्यतन करने का प्रयास कर रहा हूं। मैं अपने सरणी अनुक्रमणिका का उपयोग करके क्षेत्र का संदर्भ देना चाहता हूं (सरणी के भीतर तत्वों में कोई फ़ील्ड नहीं है जो मैं गारंटी दे सकता हूं अद्वितीय पहचानकर्ता होगा)। ऐसा लगता है कि ऐसा करना आसान होना चाहिए, लेकिन मैं वाक्यविन्यास को समझ नहीं सकता।MongoDB: मैं सरणी के भीतर इंडेक्स द्वारा संदर्भित एक सरणी में एक एकल उपखंड कैसे अपडेट करूं?

यहां मैं छद्म-जेसन में क्या करना चाहता हूं।

से पहले:

{ 
    _id : ..., 
    other_stuff ... , 
    my_array : [ 
    { ... old content A ... }, 
    { ... old content B ... }, 
    { ... old content C ... } 
    ] 
} 

के बाद:

{ 
    _id : ..., 
    other_stuff ... , 
    my_array : [ 
    { ... old content A ... }, 
    { ... NEW content B ... }, 
    { ... old content C ... } 
    ] 
} 

क्वेरी की तरह लगता है कुछ इस तरह होना चाहिए:

//pseudocode 
db.my_collection.update(
    {_id: ObjectId(document_id), my_array.1 : 1 }, 
    {my_array.$.content: NEW content B } 
) 

लेकिन यह काम नहीं करता। मैंने mongodb दस्तावेज़ों को खोजने में बहुत लंबा समय बिताया है, और इस वाक्यविन्यास पर विभिन्न भिन्नताओं की कोशिश कर रहा है (उदाहरण के लिए $slice आदि का उपयोग करना)। मुझे MongoDB में इस प्रकार के अपडेट को पूरा करने के बारे में कोई स्पष्ट स्पष्टीकरण नहीं मिल रहा है।

उत्तर

51

जैसा कि अपेक्षित है, प्रश्न पूछने के बाद क्वेरी आसान है। यहां सिंटैक्स है, पाइथन में:

db["my_collection"].update(
    { "_id": ObjectId(document_id) }, 
    { "$set": { 'documents.'+str(doc_index)+'.content' : new_content_B}} 
) 
+9

नहीं .. .. यह था वास्तव में अज्ञात – Moumit

10

'$' स्थितित्मक ऑपरेटर का उपयोग करके, मोंगो शैली में। विवरण के लिए यह link देखें।

db.my_collection.update(
    {_id: ObjectId(document_id), my_array.1 : 1 }, 
    { $set: { "my_array.$.content" : "NEW content B" } } 
) 
19

एक सूचकांक के द्वारा संदर्भित एक सरणी तत्व की अद्यतन (उदाहरण के लिए 1) मोंगो शैल में भी सीधे सूचकांक मूल्य का संकेत द्वारा किया जा सकता:

db.my_collection.update(
    {_id : "document_id"}, 
    {$set : {"my_array.1.content" : "New content B"}} 
) 
0
db.my_collection.update(
    {_id: ObjectId(document_id), my_array : { ... old content A ... } }, 
    { $set: { "my_array.$.content" : "NEW content B" } } 
) 
संबंधित मुद्दे