Mongoose: findOneAndUpdate अपडेटेड डॉक्यूमेंट वापस नहीं करता है


257

नीचे मेरा कोड है

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

var Cat = mongoose.model('Cat', {
    name: String,
    age: {type: Number, default: 20},
    create: {type: Date, default: Date.now} 
});

Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}},function(err, doc){
    if(err){
        console.log("Something wrong when updating data!");
    }

    console.log(doc);
});

मेरे पास पहले से ही मेरे मोंगो डेटाबेस में कुछ रिकॉर्ड है और मैं इस कोड को नाम अपडेट करने के लिए चलाना चाहता हूं जिसके लिए उम्र 17 वर्ष है और फिर कोड के अंत में परिणाम प्रिंट करें।

हालांकि, मुझे अभी भी कंसोल (संशोधित नाम नहीं) से एक ही परिणाम क्यों मिलता है, लेकिन जब मैं mongo db कमांड लाइन पर जाता हूं और " db.cats.find();" टाइप करता हूं । परिणाम संशोधित नाम के साथ आया था।

फिर मैं इस कोड को फिर से चलाने के लिए वापस जाता हूं और परिणाम संशोधित होता है।

मेरा प्रश्न है: यदि डेटा को संशोधित किया गया था, तो मुझे कंसोल के बाद पहली बार मूल डेटा क्यों मिला।

जवाबों:


528

ऐसा क्यूँ होता है?

डिफ़ॉल्ट वापस जाने के लिए है मूल, अनछुए दस्तावेज़। यदि आप चाहते हैं कि नया, अपडेट किया गया दस्तावेज़ लौटाया जाए तो आपको एक अतिरिक्त तर्क पास करना होगा: newसेट की गई संपत्ति के साथ एक वस्तु true

से नेवला डॉक्स :

क्वेरी # findOneAndUpdate

Model.findOneAndUpdate(conditions, update, options, (error, doc) => {
  // error: any errors that occurred
  // doc: the document before updates are applied if `new: false`, or after updates if `new = true`
});

उपलब्ध विकल्प

  • new: बूल - यदि सही है , तो मूल के बजाय संशोधित दस्तावेज़ लौटाएं । चूक को गलत (4.0 में बदला गया)

उपाय

{new: true}यदि आप docचर में अद्यतन परिणाम चाहते हैं तो पास करें :

//                                                         V--- THIS WAS ADDED
Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}}, {new: true}, (err, doc) => {
    if (err) {
        console.log("Something wrong when updating data!");
    }

    console.log(doc);
});

15
यह मेरे लिए टूटा हुआ प्रतीत होता है, यह अभी भी पुराने दस्तावेज़ को नए: सच्चे के साथ लौटाता है।
पीडीएन

@PDN आपके पास मोंगोज़ / मोंगो का कौन सा संस्करण है? यह कैसे काम करता है के साथ खिलवाड़ हो सकता है।
कोल एरिकसन

5
मेरे लिए समझ में आता है क्योंकि आपके पास पहले से ही नए दस्तावेज़ का उपयोग है
danday74

3
यह मेरे लिए काम करता है, मैं moogose संस्करण 4.6.3 का उपयोग कर रहा हूं, धन्यवाद
cesar andavisa

2
NodeJs MongoDB देशी उपयोग करता है -{ returnOriginal: false }
निक ग्रीली

78

Mongoose के बजाय Node.js ड्राइवर का उपयोग करने वाले किसी के लिए, आप {returnOriginal:false}इसके बजाय उपयोग करना चाहेंगे {new:true}


1
धन्यवाद! यह मेरे लिए मोंगोडब नोड संस्करण 2.2.27
केविन एनजी

6
यह एक तरह से एक बेवकूफ एपीआई है। मूल एपीआई के रूप में Mongoose के लिए एक ही हस्ताक्षर का उपयोग क्यों नहीं करते हैं? डिफ़ॉल्ट रूप से अपडेट किए गए दस्तावेज़ को क्यों नहीं लौटाया जाए? Mongoose हर रोज मेरे द्वारा उपयोग किए जाने वाले अधिक परेशान करने वाले कामों में से एक है।
आस्कीसाइनर्स

56

तो, "findOneAndUpdate" को मूल दस्तावेज़ वापस करने के लिए एक विकल्प की आवश्यकता होती है। और, विकल्प है:

MongoDB खोल

{returnNewDocument: true}

संदर्भ: https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/

नेवला

{new: true}

रेफरी: http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpate

Node.js MongoDB ड्राइवर API:

{returnOriginal: false}

संदर्भ: http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html#findOneAndUpdate


'returnDocument' => FindOneAndUpdate::RETURN_DOCUMENT_AFTER
लारवेल

39

डिफ़ॉल्ट रूप से findOneAndUpdate मूल दस्तावेज़ लौटाता है। यदि आप चाहते हैं कि यह संशोधित दस्तावेज़ लौटाए { new: true }तो फ़ंक्शन का विकल्प ऑब्जेक्ट पास होगा :

Cat.findOneAndUpdate({ age: 17 }, { $set: { name: "Naomi" } }, { new: true }, function(err, doc) {

});

2
_idअशक्त क्यों है ?
चोवी

14

जिस किसी ने भी मूल वादों के साथ ES6 / ES7 शैली का उपयोग करते हुए इसे ठोकर खाई है, यहां एक पैटर्न है जिसे आप अपना सकते हैं ...

const user = { id: 1, name: "Fart Face 3rd"};
const userUpdate = { name: "Pizza Face" };

try {
    user = await new Promise( ( resolve, reject ) => {
        User.update( { _id: user.id }, userUpdate, { upsert: true, new: true }, ( error, obj ) => {
            if( error ) {
                console.error( JSON.stringify( error ) );
                return reject( error );
            }

            resolve( obj );
        });
    })
} catch( error ) { /* set the world on fire */ }

15
यदि आप कॉलबैक फ़ंक्शन प्रदान नहीं करते हैं, तो Mongoose एक वादा लौटाएगा। अपना खुद का वादा करने की कोई जरूरत नहीं है!
joeytwiddle

1
यदि आप कॉलबैक प्रदान नहीं करते हैं तो @joeytwiddle Mongoose एक वादा नहीं लौटाएगा। इसके बजाय यह एक क्वेरी ऑब्जेक्ट देता है जो वादा एपीआई का केवल एक छोटा सा उपसमूह प्रदान करता है। यह मानगो दस्तावेज के अनुसार है।
जेमी रिडिंग

13

यह के लिए अद्यतन कोड है findOneAndUpdate। यह काम करता हैं।

db.collection.findOneAndUpdate(    
  { age: 17 },      
  { $set: { name: "Naomi" } },      
  {
     returnNewDocument: true
  }    
)

9

यहां मानगो अनुरक्षक। आप स्थापित करने की आवश्यकता newकरने के लिए विकल्प true(समतुल्य रूप, या, returnOriginalके लिए false)

await User.findOneAndUpdate(filter, update, { new: true });

// Equivalent
await User.findOneAndUpdate(filter, update, { returnOriginal: false });

Mongoose में findOneAndUpdate()दस्तावेज़ों को अद्यतन करने के लिए Mongoose डॉक्स और इस ट्यूटोरियल को देखें ।


मैंने सिर्फ नया लिखने के बजाय returnNewDocument लिखने की गलती की है। सहायता के लिए धन्यवाद!
user1111527

3

यदि आप परिवर्तित दस्तावेज़ को वापस करना चाहते हैं तो आपको विकल्प {new:true}एपीआई संदर्भ सेट करना होगा जिसका आप उपयोग कर सकते हैंCat.findOneAndUpdate(conditions, update, options, callback) // executes

आधिकारिक Mongoose API http://mongoosejs.com/docs/api.html#findoneandupdate_findOneAndUpdate द्वारा लिया गया आप निम्न मापदंडों का उपयोग कर सकते हैं

A.findOneAndUpdate(conditions, update, options, callback) // executes
A.findOneAndUpdate(conditions, update, options)  // returns Query
A.findOneAndUpdate(conditions, update, callback) // executes
A.findOneAndUpdate(conditions, update)           // returns Query
A.findOneAndUpdate()                             // returns Query

एक और कार्यान्वयन thats आधिकारिक एपीआई पेज में व्यक्त नहीं किया गया है और वह है जो मैं उपयोग करना पसंद करता हूं वह Promiseआधार कार्यान्वयन है जो आपको वह करने की अनुमति देता है .catchजहां आप अपने सभी विभिन्न त्रुटि से निपट सकते हैं।

    let cat: catInterface = {
        name: "Naomi"
    };

    Cat.findOneAndUpdate({age:17}, cat,{new: true}).then((data) =>{
        if(data === null){
            throw new Error('Cat Not Found');
        }
        res.json({ message: 'Cat updated!' })
        console.log("New cat data", data);
    }).catch( (error) => {
        /*
            Deal with all your errors here with your preferred error handle middleware / method
         */
        res.status(500).json({ message: 'Some Error!' })
        console.log(error);
    });

2

नीचे mongoose के लिए क्वेरी दिखाता है findOneAndUpdatenew: trueअद्यतन डॉक और पाने के लिए यहाँ प्रयोग किया जाता हैfields विशिष्ट फ़ील्ड्स को प्राप्त करने के लिए उपयोग किया जाता है।

जैसे। findOneAndUpdate(conditions, update, options, callback)

await User.findOneAndUpdate({
      "_id": data.id,
    }, { $set: { name: "Amar", designation: "Software Developer" } }, {
      new: true,
      fields: {
        'name': 1,
        'designation': 1
      }
    }).exec();

1

मुझे पता है, मुझे पहले से ही देर हो चुकी है लेकिन मुझे अपना सरल और काम करने वाला उत्तर यहाँ जोड़ने दें

const query = {} //your query here
const update = {} //your update in json here
const option = {new: true} //will return updated document

const user = await User.findOneAndUpdate(query , update, option)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.