IT story

몽구스 : findOneAndUpdate가 업데이트 된 문서를 반환하지 않습니다

hot-time 2020. 4. 23. 08:01
반응형

몽구스 : findOneAndUpdate가 업데이트 된 문서를 반환하지 않습니다


아래는 내 코드입니다

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();"를 입력하십시오 . 결과 이름이 수정되었습니다.

그런 다음이 코드를 다시 실행하여 결과가 수정됩니다.

내 질문은 : 데이터가 수정 된 경우 왜 console.log가 처음에 원래 데이터를 얻었 을까요?


기본적으로 반환하는 것입니다 원본, 변경되지 않은 문서를. 업데이트 된 새 문서를 반환하려면 new속성이로 설정된 객체를 추가 인수로 전달해야합니다 true.

로부터 몽구스 문서 :

Query # 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: bool- true경우 원본이 아닌 수정 된 문서를 반환합니다 . 기본값은 false입니다 (4.0에서 변경됨)

따라서 doc변수에 업데이트 된 결과를 원하면 다음을 수행 하십시오.

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

    console.log(doc);
});

Mongoose 대신 Node.js 드라이버를 사용 {returnOriginal:false}하는 사람은 대신 을 사용하고 싶을 것입니다 {new:true}.


따라서 "findOneAndUpdate"에는 원본 문서를 반환하는 옵션이 필요합니다. 옵션은 다음과 같습니다.

MongoDB 쉘

{returnNewDocument: true}

참조 : https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/

몽구스

{new: true}

참조 : http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate

Node.js MongoDB 드라이버 API :

{returnOriginal: false}

참조 : http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html#findOneAndUpdate


기본적으로 findOneAndUpdate 는 원본 문서를 반환합니다. 수정 된 문서를 반환하려면 옵션 객체 { new: true }를 함수에 전달 하십시오.

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

});

기본 약속과 함께 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 */ }

에 대한 업데이트 된 코드입니다 findOneAndUpdate. 효과가있다.

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

변경된 문서를 반환하려면 옵션 {new:true}API 참조 를 설정해야 합니다.Cat.findOneAndUpdate(conditions, update, options, callback) // executes

공식 몽구스 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

공식 API 페이지에 표현되지 않은 또 다른 구현은 내가 선호하는 것입니다 . 다양한 오류를 처리 할 수 있는 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);
    });

아래는 mongoose 's에 대한 쿼리를 보여줍니다 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();

참고 URL : https://stackoverflow.com/questions/32811510/mongoose-findoneandupdate-doesnt-return-updated-document

반응형