아래는 내 코드입니다
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의 문서 업데이트에 대한이 학습서를 참조하십시오 .