MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB सरणी त्रुटि के सभी क्षेत्रों को अद्यतन करता है

संपादित करें

प्रश्न से गायब विवरण यह था कि अद्यतन करने के लिए आवश्यक फ़ील्ड वास्तव में एक उप-दस्तावेज़ . में थी . इससे उत्तर काफ़ी बदल जाता है:

संभवतः . आप क्या कर सकते हैं, यह एक बाधा है सरणी तत्वों को अद्यतन करने के साथ करें। और यह दस्तावेज़ीकरण में स्पष्ट रूप से समझाया गया है . अधिकतर इस पैराग्राफ में:

तो यहाँ बात है। सभी को अपडेट करने का प्रयास किया जा रहा है इस तरह के एकल कथन में सरणी तत्वों का नहीं . होगा काम। ऐसा करने के लिए आपको निम्न कार्य करने होंगे।

db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
    doc.items.forEach(function(item) {
        item.qty = 0;
    });
    db.warehouses.update({ "_id": doc._id }, doc );
})

जो मूल रूप से हर को अपडेट करने का तरीका है सरणी तत्व।

बहु .update() . में सेटिंग कई "दस्तावेजों" में इसका मतलब है। यह नहीं एक सरणी के कई तत्वों पर लागू किया जा सकता है। इसलिए वर्तमान में सबसे अच्छा विकल्प है कि पूरी चीज को बदल दिया जाए। या इस मामले में हम संपूर्ण . को भी बदल सकते हैं दस्तावेज़ क्योंकि हमें वैसे भी ऐसा करने की ज़रूरत है।

असली . के लिए बल्क डेटा, उपयोग करें db.eval() . लेकिन कृपया पढ़ें दस्तावेज़ पहले:

db.eval(function() {
    db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
        doc.items.forEach(function(item) {
            item.qty = 0;
        });
        db.warehouses.update({ "_id": doc._id }, doc );
    });
})

सभी को अपडेट किया जा रहा है संपूर्ण . में एक सरणी के तत्व संग्रह सरल नहीं है।

मूल

त्रुटि वास्तव में क्या कहती है। एक स्थितीय ऑपरेटर का उपयोग करने के लिए आपको मिलान . की आवश्यकता है पहले कुछ। जैसे:

db.warehouses.update(
    // query 
    {
        _id:ObjectId('5322f07e139cdd7e31178b78'),
        "items.qty": { "$gt": 0 }
    },    
    // update 
    {
        $set:{"items.$.qty":0}
    },    
    // options 
    {
        "multi" : true,  
        "upsert" : true  
    }
);

तो जहां मैच कंडीशन स्थिति को पूरा करती है आइटम जो से कम . हैं 0 तो वह सूचकांक स्थितीय ऑपरेटर को पास कर दिया जाता है।

पी.एस :जब म्यूट सच है इसका मतलब है कि यह हर को अपडेट करता है दस्तावेज़। इसे false छोड़ दें अगर आपका मतलब केवल एक . है . जो डिफ़ॉल्ट है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. TypeError को कैसे हल करें:कॉलबैक। लागू कोई फ़ंक्शन नहीं है?

  2. SQL में अपने समूह के लिए न्यूनतम मान वाली पंक्तियों का चयन करने के 5 तरीके

  3. MongoDB एकत्रीकरण में सरणी फ़ील्ड मर्ज करना

  4. MongoDB $setIntersection

  5. मोंगोडब जावा एपीआई:WriteResult#getN ()