findOneAndUpdate(): एटॉमिक सिंगल-डॉक्यूमेंट अपडेट
findOneAndUpdate() फिल्टर से मेल खाने वाले पहले दस्तावेज़ को ढूंढता है, अपडेट लागू करता है, और डिफ़ॉल्ट रूप से मूल दस्तावेज़ लौटाता है। यह रेस कंडीशन-मुक्त "चेक-एंड-सेट" ऑपरेशन के लिए आदर्श है।
नमूना डेटा: डुप्लिकेट नाम
> db.demo349.insertOne({"Name": "Chris", "Marks": 56});
{ "acknowledged": true, "insertedId": ObjectId("5e55384af8647eb59e5620b4") }
> db.demo349.insertOne({"Name": "David", "Marks": 78});
{ "acknowledged": true, "insertedId": ObjectId("5e553853f8647eb59e5620b5") }
> db.demo349.insertOne({"Name": "Chris", "Marks": 89});
{ "acknowledged": true, "insertedId": ObjectId("5e55385af8647eb59e5620b6") }
> db.demo349.insertOne({"Name": "David", "Marks": 54});
{ "acknowledged": true, "insertedId": ObjectId("5e55385ff8647eb59e5620b7") }
क्वेरी: पहले "David" के Marks को 10 से बढ़ाना
> db.demo349.findOneAndUpdate({"Name": "David"}, {$inc: {Marks: 10}});
{ "_id": ObjectId("5e553853f8647eb59e5620b5"), "Name": "David", "Marks": 78 }
पहला मिलान वाला "David" (Marks 78) अपडेट हुआ। लौटाया गया दस्तावेज़ अपडेट से पहले का है।
सत्यापन
> db.demo349.find();
{ "Name": "Chris", "Marks": 56 }
{ "Name": "David", "Marks": 88 } // 78 + 10
{ "Name": "Chris", "Marks": 89 }
{ "Name": "David", "Marks": 54 }
कौन सा दस्तावेज़ अपडेट होता है? डिफ़ॉल्ट रूप से, प्राकृतिक क्रम (इंसर्ट क्रम) में पहला। sort विकल्प का उपयोग करके नियंत्रित करें (उदाहरण: {sort: {Marks: -1}} उच्चतम Marks वाले को अपडेट करने के लिए)। returnDocument: "after" अपडेट के बाद का संस्करण लौटाता है।