몽구스 : 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();
'IT story' 카테고리의 다른 글
S3 정적 웹 사이트 호스팅 Index.html에 모든 경로 라우팅 (0) | 2020.04.23 |
---|---|
.svn 디렉토리를 무시하기 위해`find`를 어떻게 얻을 수 있습니까? (0) | 2020.04.23 |
Java에서 mod의 구문은 무엇입니까 (0) | 2020.04.23 |
JavaScript에서 "0"이 false 인 이유는 있지만 'if'로 테스트 할 때 자체적으로 false가 아닌 이유는 무엇입니까? (0) | 2020.04.23 |
sed를 사용하여 첫 번째 일치 후 줄 삽입 (0) | 2020.04.22 |