티스토리 뷰

RDB만 써오던 나란 사람은 noSql을 잘 다루지 못하는 상황에서 무턱대고 몽고DB를 쓰고 있다.

쿼리도 짤 줄 모르면서 어째어째 잘 쓸 수 있는 이유는 Mongoose의 쿼리빌더 덕분이다.

 

물론 회사에서 현재 진행중인 프로젝트가 nodejs 상에서 knex를 사용하고 있기 때문에 (postgresql 이긴 하지만)

Mongoose의 쿼리빌더가 생소하게 느껴지진 않았다.

 

몽구스 쿼리빌더! 누구나 꼭 쓸만한 아주아주 기본적인! 몇가지만 정리해 보려고 한다.

 

일단 아래와 같이 Player 라는 model이 있다고 가정해보겠다.

const Player = new mongoose.Schema({
  name: String,
  team: String,
  age : Number
})

where

가장 기본적인 놈이다. 말그대로 where 니깐.

(뒤에 나오는 'or' 빼고는 where를 쓸 수도 있고 생략할 수 있다! 대신 파라미터에 필드명도 같이 명시해야한다.)

Player.find()
  .where('name') // name 에 대해서 이후 조건을 추가해준다.

equals, ne

필드 값이 특정 값과 일치하는지, 혹은 일치하지 않는지 비교한다.

Player.find()
  where('name').equals('drogba')
  
Player.find()
  ne('name', 'drogba')

gt, gte, lt, lte

딱 봐도 알겠지만 greater than (or equal), less than (or equal) 의 약자들이다.

Player.find()
  .where('age').gt(30)
  
Player.find()
  .lte('age', 35)

in, nin

각각 in, not in 이다.

Player.find()
  .where('team').in(['chelsea', 'liverpool'])
  
Player.find()
  .in('team', ['chelsea', 'liverpool'])

or

둘 중에 하나라도 만족하면 true. (얘는 where 랑 쓰지 않는다.)

Player.find()
  .or([{'name', 'drobga'}, {'team', 'chelsea'}]) // 이름이 drogba 거나 팀이 chelsea 거나

select

명시하지 않으면 document의 모든 필드를 가져오지만, 특정 필드만을 가져오게 할 수 있다.

Player.find()
  .where('name'),equals('drogba')
  .select('name age') // 콤마가 아니라 공백으로 구분한다.

sort

정렬이다. asc, desc 가 있고, 1과 -1로 표현할 수도 있다. (default는 asc.)

Player.find()
  .where('name').equals('drobga')
  .sort('name age') // asc
  .sort('-name -age') // desc
  .sort({name: 'asc', age: 'desc'}) // object 형태로도 가능

마지막으로 정리하자면 위에 나온 메소드들을 아래와 같이 쭉쭉 붙여 쿼리를 만들 수 있는 것이다.

Player.find()
  .where('name').equals('drogba')
  .in('team', ['chelsea', 'liverpool'])
  .gte('age', 30)
  .select('name team age')
  .sort('name team -age')

이 외에도 정말 많은 메소드들이 있지만 일단 굉장히 복잡한 쿼리가 아니라면

요정도 메소드 선에서도 필요한 쿼리는 대부분 짤 수 있을 것이다.

 

다음 기회에 다른 메소드들도 추가로 정리해보겠다. (아직 공부가 필요하다..ㅠ)

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함