오늘은 mongoose의 Query에 대한 소소한 정보들을 정리해보려 합니다.
"아~ 그랬구나~" 하고 조금더 깊이 이해하게 되는 시간이 되면 좋겠습니다.
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 { >e: 30 }});
// Equivalent:
Customer.find({ email: /foo\./bar/ }).find({ age: { $gte: 30 }});
얼마든지 많은 .find()를 추가할 수 있습니다.
Mongoose를 사용하는 큰 장점은 mongoose가 알아서 쿼리/검색 조건들을 모델의 스키마로 형변환해준다는 것입니다.
// 몽구스는 알아서 '_id'를 알아서 Object로, '25'를 number로 변환해줍니다.
Customer.find({ _id: res[0]._id.toHexString(), age: { $gte: '25' } });
위 코드를 보시면 직접 String을 ObjectID로 변환해줄 필요도 없고, String을 숫자로 형변환하여 전달할 필요도 없다는 것입니다.
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()
메서드를 이용하면 됩니다.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맨 뒤에 붙게 된다면 쿼리를 실행시킬수 있게 됩니다.