Mongoose - 실행 기능은 무엇을 합니까?
쿼리 findOne과 exec() 함수가 포함된 Mongoose 코드를 발견했습니다.
자바스크립트에서 그 방법을 본 적이 없습니까?정확히 무슨 일을 하는 거지?
기본적으로 mongoose를 사용할 때 도우미를 사용하여 문서를 검색할 수 있습니다.쿼리 조건을 수락하는 모든 모델 메소드는 다음과 같은 방법으로 실행될 수 있습니다.callback
는또.exec
방법.
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
따라서 콜백을 통과하지 못하면 쿼리를 작성하여 실행할 수 있습니다.
mongoose 문서에서 추가 정보를 찾을 수 있습니다.
갱신하다
Mongoose 비동기 작업과 함께 Promise를 사용할 때 주의해야 할 점은 Mongoose 쿼리가 Promise가 아니라는 것입니다.쿼리는 테이블을 반환하지만, 실제 약속이 필요하면 사용해야 합니다.exec
방법.자세한 내용은 여기에서 확인할 수 있습니다.
업데이트하는 동안 다음 질문에 명확하게 답변하지 않았습니다.
자바스크립트에서 그 방법을 본 적이 없습니까?정확히 무슨 일을 하는 거지?
이것은 네이티브 자바스크립트 방식이 아니라 Mongoose API의 일부입니다.
는 대절사안함용함을 절대 .exec()
모델에서 CRUD(작성, 읽기, 업데이트, 삭제)를 완료하는 기능입니다.모델에 CRUD를 사용하려면 다음과 같이 사용합니다.
const user = await UserModel.findOne(userCondition);
그리고 그것은 항상 그 일을 합니다. 저는 야?"라고 생각했어요."라고 생각했습니다.exec()
"에 사용?몽구스 문서를 검색해보니 여기서 답을 찾았습니다.
waitexec() With wait?exec() With wait 사를합니용까야?
그리고 여기 그 이야기가 있습니다.
모델에 대해 쿼리를 실행하는 방법은 두 가지가 있습니다.용사를 합니다.callback
는사용을 사용합니다.exec()
기능."하지만"을 사용할 수 있습니다.await
무너.exec()
함수는 약속을 반환합니다. 이 약속을 사용할 수 있습니다.then()
또는async/await
모델 "연속"에 대해 쿼리를 실행합니다.그래서 질문은 "만약 내가 그냥 사용할 수 있다면"입니다.user = await UserModel.find()
그리고 그것은 제대로 작동하는데, 내가 왜 사용해야 합니까?exec()
기능?"문서에서 찾을 수 있는 답변은 다음과 같습니다.
를 사용하는 것에는 두 가지 차이점이 있습니다.await
와 함께exec()
아니면 그것 없이.
- 기능 측면에서 볼 때 다음과 같은 기능을 사용하는 것과 차이가 없습니다.
await
와 함께exec()
아니면 그것 없이.▁▁query▁a만▁you 없이 쿼리를 호출할exec()
또는callback
를 합니다.thenable
그것은 약속과 같은 것이지만 약속이 아닙니다.(여기서 차이점을 찾을 수 있습니다.)하지만 당신이 사용할 때exec()
쿼리를 실행하면 응답으로 정확히 약속을 얻을 수 있습니다.
// returns a thenable as response that is not a promise, but you can use await and then() with it.
const user = await UserModel.findOne(userCondition);
// returns exactly a promise.
const user = await UserModel.findOne(userCondition).exec();
- 또 다른 차이점은, 만약 당신이
await
와 함께exec()
쿼리 실행 시 오류가 발생하면 "스택 추적"이 향상됩니다.그래서:
이 두 줄은 동일한 작업을 수행합니다.
const user = await UserModel.findOne(userCondition);
// does exactly as the before line does, but you get a better stack trace if any error happened
const user = await UserModel.findOne(userCondition).exec();
다니엘은 이것에 대해 꽤 멋지게 대답했습니다.쿼리를 작성하고 실행하는 방법의 전체 목록을 자세히 설명하려면 다음 사용 사례를 참조하십시오.
건물 조회
Mongoose는 다음 시간까지 쿼리를 실행하지 않습니다.then
또는exec
그것이 호출되었습니다.이것은 복잡한 쿼리를 작성할 때 매우 유용합니다.몇 가지 예는 다음과 같습니다.populate
그리고.aggregate
기능들.
User.find({name: 'John'}) // Will not execute
콜백을 통한 실행
중첩 특성으로 인해 많은 사람이 싫어하지만, 선택적 콜백을 제공하여 쿼리를 실행할 수 있습니다.
User.find({name: 'John'}, (err, res) => {}) // Will execute
그렇다면 API as a Promise/A+
Mongoose 쿼리는 다음을 제공합니다.then
기능.이것은 규칙적인 약속과 혼동되어서는 안 됩니다.간단히 말해, Promise/A+ 사양에는 다음이 필요합니다.then
우리가 약속에 익숙해진 것처럼 작동하는 기능.
User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel
exec 함수
Mongoose 문서에서If you need a fully-fledged promise, use the .exec() function.
User.find({name: 'John'}).exec(); // Will execute returning a promise
exec()
콜백이 제공되지 않으면 약속을 반환합니다.따라서 다음 패턴은 매우 편리하고 일반적이며 콜백 또는 약속을 잘 처리할 수 있습니다.
function findAll(query, populate, cb) {
let q = Response.find(query);
if (populate && populate.length > 0) {
q = q.populate(populate);
}
// cb is optional, will return promise if cb == null
return q.lean().exec(cb);
}
그러기 위해서는 Mongoose와 Bluebird 약속을 사용하는 것이 좋습니다.
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
모든 대답이 정확하지만 가장 쉬운 방법은 현대적인 비동기 대기 접근법을 사용하는 것입니다.
async ()=> {
const requiresUser = await User.findByIdAndUpdate(userId,{name:'noname'},{ new:true}).exec()
기본적으로 mongoose 쿼리는 약속을 반환하지 않습니다.그래서 우리는 그들이 약속처럼 작동하기를 원한다면 실행 기능을 사용합니다.
데이터를 가져오는 한 가지 방법:
find().exec((err,data)=>{
})
다른 방법:
const res=await find()
언급URL : https://stackoverflow.com/questions/31549857/mongoose-what-does-the-exec-function-do
'source' 카테고리의 다른 글
업데이트 메서드 호출 없이 트랜잭션 저장 (0) | 2023.08.09 |
---|---|
스위프트에서 열거형을 프로토콜에 맞게 만드는 방법은 무엇입니까? (0) | 2023.08.09 |
아래쪽 점이 있는 Android ViewPager (0) | 2023.08.09 |
Oracle의 NULLS FIRST에 해당하는 SQL Server? (0) | 2023.08.04 |
결과 열의 다른 값을 다른 열 sql의 값별로 단일 행으로 가져오는 방법 (0) | 2023.08.04 |