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

नेवला दस्तावेज़ को अधिलेखित कर देता है बजाय इसके कि `$set` फ़ील्ड

वास्तव में, लेकिन इस तथ्य के लिए कि नेवला वास्तव में कवर के तहत अपडेट के साथ "गड़बड़" कर रहा है, यह वास्तव में एक नियमित MongoDB फ़ंक्शन के लिए आपके सबमिशन की डिफ़ॉल्ट क्रिया है।

तो नेवला इसे "बुद्धिमान" के रूप में "अनुमान" के लिए एक सुविधाजनक विधि के रूप में मानता है जिसका मतलब है कि आप एक $set जारी करना चाहते हैं निर्देश यहाँ। चूंकि आप वास्तव में इस मामले में ऐसा नहीं करना चाहते हैं, आप { overwrite: true } के माध्यम से उस व्यवहार को बंद कर देते हैं किसी भी .update() . को दिए गए विकल्पों में विधि:

एक पूर्ण उदाहरण के रूप में:

const mongoose = require('mongoose'),
      Schema = mongoose.Schema;

mongoose.Promise = global.Promise;
mongoose.set('debug',true);

const uri = 'mongodb://localhost/test',
      options = { useMongoClient: true };

const testSchema = new Schema({
  name: String,
  phone: String
});

const Test = mongoose.model('Test', testSchema);

function log(data) {
  console.log(JSON.stringify(data,undefined,2))
}

(async function() {

  try {

    const conn = await mongoose.connect(uri,options);

    // Clean data
    await Promise.all(
      Object.keys(conn.models).map( m => conn.models[m].remove({}) )
    );

    // Create a document
    let test = await Test.create({
      name: 'john doe',
      phone: '+12345678901'
    });
    log(test);

    // This update will apply using $set for the name
    let notover = await Test.findOneAndUpdate(
      { _id: test._id },
      { name: 'Bill S. Preston' },
      { new: true }
    );
    log(notover);

    // This update will just use the supplied object, and overwrite
    let updated = await Test.findOneAndUpdate(
      { _id: test._id },
      { name: 'Dan Smith' },
      { new: true, overwrite: true }
    );
    log(updated);


  } catch (e) {
    console.error(e);
  } finally {
    mongoose.disconnect();
  }

})()

उत्पादन:

Mongoose: tests.remove({}, {})
Mongoose: tests.insert({ name: 'john doe', phone: '+12345678901', _id: ObjectId("596efb0ec941ff0ec319ac1e"), __v: 0 })
{
  "__v": 0,
  "name": "john doe",
  "phone": "+12345678901",
  "_id": "596efb0ec941ff0ec319ac1e"
}
Mongoose: tests.findAndModify({ _id: ObjectId("596efb0ec941ff0ec319ac1e") }, [], { '$set': { name: 'Bill S. Preston' } }, { new: true, upsert: false, remove: false, fields: {} })
{
  "_id": "596efb0ec941ff0ec319ac1e",
  "name": "Bill S. Preston",
  "phone": "+12345678901",
  "__v": 0
}
Mongoose: tests.findAndModify({ _id: ObjectId("596efb0ec941ff0ec319ac1e") }, [], { name: 'Dan Smith' }, { new: true, overwrite: true, upsert: false, remove: false, fields: {} })
{
  "_id": "596efb0ec941ff0ec319ac1e",
  "name": "Dan Smith"
}

दस्तावेज़ दिखाना "अधिलेखित" है क्योंकि हमने $set . को दबा दिया है ऑपरेशन जो अन्यथा प्रक्षेपित होता। दो नमूने पहले overwrite के बिना दिखाई देते हैं विकल्प, जो $set . पर लागू होता है संशोधक, और फिर "के साथ" overwrite विकल्प, जहां आपने "अपडेट" के लिए पास की गई वस्तु का सम्मान किया है और ऐसा कोई $set नहीं है संशोधक लागू किया जाता है।

ध्यान दें, इस प्रकार MongoDB नोड ड्राइवर "डिफ़ॉल्ट रूप से" करता है। तो "निहित" $set . में जोड़ने का व्यवहार नेवले द्वारा किया जा रहा है, जब तक कि आप इसे न कहें।

<ब्लॉककोट>

नोट "प्रतिस्थापित" करने का सही तरीका वास्तव में replaceOne . का उपयोग करना होगा , या तो replaceOne() . की API विधि के रूप में या bulkWrite() . के माध्यम से . overwrite एक विरासत है कि कैसे नेवला $set . को लागू करना चाहता है जैसा कि ऊपर वर्णित और प्रदर्शित किया गया है, हालांकि MongoDB आधिकारिक API replaceOne . का परिचय देता है एक "विशेष" . के रूप में update() का राजा ऑपरेशन जो अनुमति नहीं देता परमाणु ऑपरेटरों जैसे $set . का उपयोग कथन के भीतर और यदि आप कोशिश करते हैं तो त्रुटि होगी।

प्रतिस्थापित करें . के बाद से यह शब्दार्थ की दृष्टि से बहुत स्पष्ट है यह बहुत स्पष्ट रूप से पढ़ता है कि वास्तव में किस विधि का उपयोग किया जाता है। update() . पर मानक API कॉल के अंतर्गत निश्चित रूप से वेरिएंट अभी भी आपको परमाणु ऑपरेटरों को छोड़ने की अनुमति देते हैं और बस प्रतिस्थापित . करेंगे वैसे भी सामग्री। लेकिन चेतावनियों की अपेक्षा की जानी चाहिए।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB हैशेड इंडेक्स का मामला

  2. नोड.जेएस और मोंगोडब में पंजीकरण और लॉगिन फॉर्म बनाना

  3. $lookup के साथ MongoDB एकत्रीकरण में केवल (या प्रोजेक्ट) क्वेरी से वापस आने के लिए कुछ फ़ील्ड शामिल हैं

  4. सुरक्षा के लिए वास्तुकला:MongoDB के लिए एक गाइड

  5. mongoDB/mongoose:अद्वितीय अगर अशक्त नहीं है