쿼리 findOne과 exec () 함수가 포함 된 Mongoose 코드를 발견했습니다.
이전에 Javascript에서 해당 방법을 본 적이 없습니까? 정확히 무엇을합니까?
쿼리 findOne과 exec () 함수가 포함 된 Mongoose 코드를 발견했습니다.
이전에 Javascript에서 해당 방법을 본 적이 없습니까? 정확히 무엇을합니까?
답변:
기본적으로 몽구스를 사용할 때 도우미를 사용하여 문서를 검색 할 수 있습니다. 쿼리 조건을 허용하는 모든 모델 메서드는 callback
또는 exec
메서드를 통해 실행할 수 있습니다 .
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
따라서 콜백을 전달하지 않으면 쿼리를 작성하고 결국 실행할 수 있습니다.
몽구스 문서 에서 추가 정보를 찾을 수 있습니다. .
최신 정보
Mongoose 비동기 작업과 함께 Promise 를 사용할 때 유의해야 할 점 은 Mongoose 쿼리가 Promise 가 아니라는 것 입니다. 쿼리는 thenable을 반환 하지만 실제 Promise 가 필요한 경우 exec
메서드를 사용해야합니다 . 자세한 내용은 여기 에서 확인할 수 있습니다 .
업데이트하는 동안 질문에 명시 적으로 답변하지 않은 것으로 나타났습니다.
이전에 Javascript에서 해당 방법을 본 적이 없습니까? 정확히 무엇을합니까?
글쎄 그건 하지 네이티브 자바 스크립트 방법,하지만 몽구스 API의 일부.
exec
메서드 를 호출해야한다고 생각합니다 . 이것은 적어도 문서에서하는 일입니다. 으로 자신을 확인할 수 있는지 확인하십시오 Model.find() instanceof require('bluebird')
. 도움이 되었기를 바랍니다.
Model.update().exec()
있는지 그것을 실행할 수 있도록. 그런 다음 업데이트를 기다리지 않고 API에 응답 할 수 있습니다.
다니엘은 이에 대해 매우 아름답게 대답했습니다. 쿼리를 작성하고 실행하는 방법의 전체 목록을 자세히 설명하려면 다음 사용 사례를 살펴보십시오.
쿼리 작성
Mongoose는 then
또는 exec
호출 될 때까지 쿼리를 실행하지 않습니다 . 이것은 복잡한 쿼리를 작성할 때 매우 유용합니다. 몇 가지 예에는 populate
및 aggregate
함수 사용이 포함될 수 있습니다 .
User.find({name: 'John'}) // Will not execute
콜백을 통한 실행
중첩 특성으로 인해 많은 사람들이 싫어하지만 선택적 콜백을 제공하여 쿼리를 실행할 수 있습니다.
User.find({name: 'John'}, (err, res) => {}) // Will execute
그런 다음 약속 / A +로서의 API
몽구스 쿼리는 then
기능을 제공 합니다. 이것은 일반적인 약속과 혼동해서는 안됩니다. 간단히 말해서 Promises / A + 사양에는 then
우리가 promise를 사용하는 방식과 매우 유사하게 작동 하는 함수가 필요합니다 .
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
then
쿼리에서 약속을 반환 할 수도 있습니다 . 이것은 exec
. 이 편리한 사용 사례는 Promise.all
. exec
그래도 그런 맥락에서 약속이 반환되었는지 확실하지 않습니다 .
exec()
콜백이 제공되지 않으면 promise를 반환합니다. 따라서 다음 패턴은 매우 편리하고 일반적입니다. 콜백이나 약속을 멋지게 처리 할 수 있습니다.
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 promise를 사용하는 것이 좋습니다. 이렇게하려면 다음 호출을 사용하세요.
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');