[node.js] 몽구스 : 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에서 변경됨)

해결책

통과 {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);
});


답변

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(동등, 또는 returnOriginal으로 false)

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

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

Mongoose findOneAndUpdate()문서Mongoose의 문서 업데이트에 대한이 학습서를 참조하십시오 .