mongoose.find()

Q kim·2021년 1월 11일
0

오늘은 mongoose의 Query에 대한 소소한 정보들을 정리해보려 합니다.
"아~ 그랬구나~" 하고 조금더 깊이 이해하게 되는 시간이 되면 좋겠습니다.

Models and Queries

Mongoose는 두가지의 find() 함수를 가지고 있습니다. Model.find()Query#find()가 있습니다. Query#find()는 Query.prototype.find()의 줄임 표현이고, find()는 Query 클래스의 인스턴스 메서드입니다.

Query를 직접 생성하지않고 Model.find()를 실행하여 Query의 인스턴스를 리턴받습니다.

const query = Customer.find();  // instanciate Query
query instanceof mongoose.Query; // true
const docs = await query; // Get the documents

Model.find()로부터 리턴받은 Query 인스턴스를 이용하여 우리는 여러 검색조건을 추가적으로 붙일 수 있습니다. 솔팅, 필터링 같은 것 말이죠.

Customer.find({ email: /foo\.bar/, age { &gte: 30 }});
// Equivalent:
Customer.find({ email: /foo\./bar/ }).find({ age: { $gte: 30 }});

얼마든지 많은 .find()를 추가할 수 있습니다.

Auth casting

Mongoose를 사용하는 큰 장점은 mongoose가 알아서 쿼리/검색 조건들을 모델의 스키마로 형변환해준다는 것입니다.

// 몽구스는 알아서 '_id'를 알아서 Object로, '25'를 number로 변환해줍니다.
Customer.find({ _id: res[0]._id.toHexString(), age: { $gte: '25' } });

위 코드를 보시면 직접 String을 ObjectID로 변환해줄 필요도 없고, String을 숫자로 형변환하여 전달할 필요도 없다는 것입니다.

Mongoose query는 then() 함수를 가진 thenable입니다. 프로미스를 이용하듯이 이용할수 있습니다.

Customer.find({ name: 'A' }).
  then(customers => {              
    console.log(customers[0].name); // 'A'
    return Customer.find({ name: 'B' });
  }).
  then(customers => {
    console.log(customers[0].name); // 'B'
  });

Exec

Query를 이용할 때 프로미스를 리턴받고 싶다면 exec() 메서드를 이용하면 됩니다.

Users.findOne({ id: 12 })
  .exec() // returns full ES6 Promise
  .then(theUser => {
    let name = theUser.name;
    let newName = name + ' the cat';
    return Users.findOneAndUpdate(
      { id: 12 },
      { name: newName },
      { upsert: true, new: true }
    );
  })
  .then(updated => {
    //user updated
  })
  .catch(err => {
    console.log(err);
  });

또한 exec() 함수가 query맨 뒤에 붙게 된다면 쿼리를 실행시킬수 있게 됩니다.

profile
https://medium.com/nodejs-server

0개의 댓글