মঙ্গুজ: সন্ধান করুন ওঅ্যান্ডআপেট আপডেট হওয়া দস্তাবেজ ফেরত দেয় না


254

নীচে আমার কোড দেওয়া আছে

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 এর নাম আপডেট করার জন্য এই কোডটি চালাতে চাই এবং কোডের শেষে ফলাফল মুদ্রণ করতে পারি।

তবে কেন আমি এখনও কনসোল থেকে একই ফলাফল পেয়েছি (পরিবর্তিত নাম নয়) তবে যখন আমি মঙ্গো ডিবি কমান্ড লাইনে যাই এবং টাইপ করি " db.cats.find();"। পরিবর্তিত নাম নিয়ে ফলাফল এসেছে।

তারপরে আমি আবার এই কোডটি চালাতে ফিরে যাই এবং ফলাফলটি সংশোধন করা হয়।

আমার প্রশ্ন হ'ল: যদি ডেটাটি সংশোধন করা হয়, তবে কেন কনসোল.লগ করার পরে কেন আমি এখনও প্রথম সময়ে আসল তথ্য পেয়েছি।

উত্তর:


527

কেন এমন হয়?

ডিফল্ট আসতে হয় মূল, অবিকৃত নথি। আপনি যদি নতুন, আপডেট হওয়া দস্তাবেজটি ফেরত চান তবে আপনাকে অতিরিক্ত যুক্তি দিতে হবে: 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: বুল - যদি সত্য হয় তবে মূলটির পরিবর্তে পরিবর্তিত নথিটি ফিরিয়ে দিন । মিথ্যাতে ডিফল্ট (৪.০ এ পরিবর্তিত)

সমাধান

{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
এটি আমার জন্য কাজ করেছে, আমি মোগোগোস সংস্করণটি 4.6.3 ব্যবহার করছি, ধন্যবাদ
সিজার আন্ডাভিসা

2
নোডজেস মঙ্গোডিবি নেটিভ ব্যবহার করে -{ returnOriginal: false }
নিক গ্রেলে

78

মোঙ্গুজের পরিবর্তে নোড.জেএস ড্রাইভারটি যে কেউ ব্যবহার করছেন, আপনি তার {returnOriginal:false}পরিবর্তে ব্যবহার করতে চাইবেন {new:true}


1
ধন্যবাদ! এটি আমার জন্য মঙ্গডব নোড সংস্করণ ২.২.২7
কেভিন এনজি

6
এটি একটি ইডিয়ট এপিআইর মতো। নেটিভ এপিআই হিসাবে মঙ্গুজের জন্য একই স্বাক্ষরগুলি কেন ব্যবহার করবেন না? ডিফল্টরূপে আপডেট হওয়া ডকটি কেন ফিরিয়ে দেবে না? আমি প্রতিদিন ব্যবহার করি এমন বেশি জ্বালাময় লিবগুলির মধ্যে একটি মঙ্গুজ।
Askdesigners

56

সুতরাং, "FindOneAndUpdate" এর জন্য মূল ডকুমেন্টটি ফিরিয়ে আনতে একটি বিকল্প প্রয়োজন। এবং, বিকল্পটি হ'ল:

মঙ্গোডিবি শেল

{returnNewDocument: true}

রেফ: https://docs.mongodb.com/manual/references/method/db.collection.findOneAndUpdate/

নকুল

{new: true}

রেফার: http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate

নোড.জেএস মোংগোডিবি ড্রাইভার এপিআই:

{returnOriginal: false}

তথ্যসূত্র: http://mongodb.github.io/node-mongodb-native/3.0/api/ Col લેક્. h


'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
আপনি যদি কলব্যাক ফাংশন না সরবরাহ করেন তবে মঙ্গুজ কোনও প্রতিশ্রুতি ফিরিয়ে দেবে। নিজের প্রতিশ্রুতি তৈরি করার দরকার নেই!
জোয়েটউইডেল

1
আপনি যদি কলব্যাক না দিয়ে থাকেন তবে @ জোয়েটউইলড মঙ্গুজ কোনও প্রতিশ্রুতি ফিরিয়ে দেবে না । পরিবর্তে এটি একটি ক্যোয়ারী অবজেক্ট দেয় যা প্রতিশ্রুতি এপিআইয়ের কেবল একটি ছোট উপসেট সরবরাহ করে। এটি মঙ্গুজ দলিল অনুসারে according
জ্যামি রিডিং

13

এটি এর জন্য আপডেট হওয়া কোড findOneAndUpdate। এটা কাজ করে।

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

8

মঙ্গুজ রক্ষণাবেক্ষণকারী এখানে। আপনি সেট করতে হবে newবিকল্প true(equivalently, বা, returnOriginalকরতে false)

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

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

মঙ্গুজে findOneAndUpdate()নথি আপডেট করার বিষয়ে মঙ্গুজ ডক্স এবং এই টিউটোরিয়ালটি দেখুন ।


আমি কেবল নতুনের পরিবর্তে রিটার্ন নিউ ডকুমেন্ট লিখতে ভুল করেছি। সাহায্যের জন্য ধন্যবাদ!
ব্যবহারকারী 1111527

3

আপনি যদি পরিবর্তিত দস্তাবেজটি ফিরিয়ে দিতে চান তবে আপনি {new:true}ব্যবহার করতে পারেন বিকল্পের রেফারেন্স সেট করতে হবেCat.findOneAndUpdate(conditions, update, options, callback) // executes

অফিসিয়াল মঙ্গুজ এপিআই 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

আর একটি বাস্তবায়নের বিষয়টি অফিসিয়াল এপিআই পৃষ্ঠায় প্রকাশ করা হয়নি এবং আমি যা ব্যবহার করতে পছন্দ করি তা হ'ল Promiseবেস বাস্তবায়ন যা আপনাকে .catchসেখানে আপনার সমস্ত বিভিন্ন ত্রুটি মোকাবেলা করতে পারে where

    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

নীচে মঙ্গুজের জন্য কোয়েরি দেখায় findOneAndUpdate। এখানে new: 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();

0

আমি জানি, আমি ইতিমধ্যে দেরি করেছি তবে আমাকে এখানে আমার সহজ এবং কার্যকরী উত্তর যুক্ত করুন

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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.