Mongoose-exec 함수는 무엇을합니까?


101

쿼리 findOne과 exec () 함수가 포함 된 Mongoose 코드를 발견했습니다.

이전에 Javascript에서 해당 방법을 본 적이 없습니까? 정확히 무엇을합니까?

답변:


146

기본적으로 몽구스를 사용할 때 도우미를 사용하여 문서를 검색 할 수 있습니다. 쿼리 조건을 허용하는 모든 모델 메서드는 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의 일부.


4
mongoose.Promise = require ( 'bluebird')를 설정 한 경우 .exec ()를 사용해야합니까? 감사.
wayofthefuture

4
@wayofthefuture이 문제에 대해 문서가 정말 혼란 스럽지만 여전히 exec메서드 를 호출해야한다고 생각합니다 . 이것은 적어도 문서에서하는 일입니다. 으로 자신을 확인할 수 있는지 확인하십시오 Model.find() instanceof require('bluebird'). 도움이 되었기를 바랍니다.
danillouz

1
그리고 delete 및 insertMany와 같은 다른 작업에 대한 질문이 있습니다 ...이 경우 exec ()가 필요합니까? ... 후드 아래 쿼리의 어떤 종류를 사용해야 할 것입니다 삭제
wayofthefuture

1
콜백이 전달되지 않는 경우 간부 또한 내가 말을해야 매우 편리하다, 약속을 반환
알렉산더 밀스

누군가를 구할 수 있습니다 . Model.update ()가 작업을 수행하고 그다지 중요하지 않은 데이터가 업데이트 될 때까지 기다리지 않고 API에 응답을 반환 할 것이라고 생각하는 경우; 업데이트가 실행되지 않습니다. 당신은 할 필요가 Model.update().exec()있는지 그것을 실행할 수 있도록. 그런 다음 업데이트를 기다리지 않고 API에 응답 할 수 있습니다.
Yogesh

49

다니엘은 이에 대해 매우 아름답게 대답했습니다. 쿼리를 작성하고 실행하는 방법의 전체 목록을 자세히 설명하려면 다음 사용 사례를 살펴보십시오.

쿼리 작성

Mongoose는 then또는 exec호출 될 때까지 쿼리를 실행하지 않습니다 . 이것은 복잡한 쿼리를 작성할 때 매우 유용합니다. 몇 가지 예에는 populateaggregate함수 사용이 포함될 수 있습니다 .

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

1
문서에서는 명시 적으로 언급하지 않았지만 예제에서는 User.save ()도 약속을 반환하는 것을 보여줍니다. exec () 및 save () 외에도 모델의 다른 몽구스 메서드가 약속을 반환합니까, 아니면이 둘만 있습니까?
thetrystero

위에서 언급했듯이 then쿼리에서 약속을 반환 할 수도 있습니다 . 이것은 exec. 이 편리한 사용 사례는 Promise.all. exec그래도 그런 맥락에서 약속이 반환되었는지 확실하지 않습니다 .
Anshul Koka

[ACCEPTED ANSWER]
Cody

.exec ()로 완전한 예제를 추가해 주시겠습니까? @AnshulKoka는 .exec ()가 자동으로 쿼리 비동기를 만들거나 내가 추가해야 그것을인가 비동기 / await를
O'Dane Brissett

쿼리를 비동기로 만들려면 async / await가 필요하므로 질문을 이해하는지 잘 모르겠습니다. 완전한 예에 대한 귀하의 요청을 위해 내 예의 접두사를 기다리십시오.
Anshul Koka

8

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');

블루 버드가 왜 필요한가요? exec ()가있을 때
Indraraj26
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.