MongoDB: मैं किसी सरणी में किसी एकल सबलेमेंट को कैसे अपडेट करूं, जो कि सरणी के भीतर सूचकांक द्वारा संदर्भित है?


84

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

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

इससे पहले:

{
  _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 }
)

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

जवाबों:


76

जैसा कि आप जानते हैं कि एक बार क्वेरी आसान है। यहाँ सिंटैक्स है, अजगर में:

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

13
यह दस्तावेज कहां है?
रोरोकोरोर

यह सरणी को अद्यतन करने के बजाय एक ही नाम की एक वस्तु का निर्माण करता है
किसांग जूल

यह निश्चित रूप से एक अप्रचलित उत्तर है।
मार्क ओडे

49

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

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

यदि हम इंडेक्स नहीं जानते हैं तो हम इसे कैसे करेंगे?
मुहम्मद शहजाद

46

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

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

यही सबसे अच्छा जवाब है!
बोगदान कोबलिनस्की

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

5

जब किसी वास्तविक तत्व को जाने बिना एक सरणी तत्व को अद्यतन करना आवश्यक होता है, लेकिन तत्व का एक विशिष्ट पहचानकर्ता होता है:

// Modify a comment in a bucket
db.POST_COMMENT.update(
    {
        "_id": ObjectId("5ec424a1ed1af85a50855964"),
        "bucket.commentId": "5eaf258bb80a1f03cd97a3ad_lepf4f"
    },
    {
        $set: {
            "bucket.$.text": "Comment text changed",
            "bucket.$.createdDate": ISODate("2015-12-11T14:12:00.000+0000")
        }
    }
)

यहाँ "bucket.commentId"एक सरणी तत्व का विशिष्ट पहचानकर्ता है।


FindAndModify के साथ Mongo शेल में, दोहरे उद्धरण $setमेरे लिए काम नहीं करते हैं। मुझे मैदान के लिए एकल उद्धरण का उपयोग करना होगा।
पश्चिमीगुन

4

आप सरणी में तत्व के सूचकांक को पास करने वाले mongoDB के अपडेट फ़ंक्शन का उपयोग कर सकते हैं, यदि पुरानी सामग्री बी की कुंजी प्रति उदाहरण "मान" है:

[
...
"value" : "old content A"
"value" : "old content B"
"value" : "old content C"
...
]

कमांड इस तरह होनी चाहिए:

db.collection.updateOne({"_id" : "...,"},{$set: {"my_array.1.value": "NEW content B"}})

5
यदि हम इंडेक्स नहीं जानते हैं तो हम इसे कैसे करेंगे?
शहरयार किरमानी


1

जब एक वास्तविक तत्व को जाने बिना एक सरणी तत्व को अपडेट करना आवश्यक है, लेकिन तत्व का एक विशिष्ट पहचानकर्ता है

db.getCollection('profiles').update(
  {
    'userId':'4360a380-1540-45d9-b902-200f2d346263',
    'skills.name':'css'
  },
  {
      $set: {'skills.$.proficiencyLevel': 5}
  }, 
  {
      multi: true
  }
)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.