Mongoose Query Builder

Casin·2022년 10월 21일
0

Mongoose(MongoDB)

목록 보기
2/3
post-thumbnail
  • Mongoose의 기본적인 CRUD 방법을 알아야함.

몽고DB에서 자주 사용할법한 쿼리 빌더 기능들만 정리할 예정

select

명시하지 않으면 모든 필드를 가져오고, 설정 값에따라서 원하는 필드만 가져오거나 제외할 수 있다.

const selected = await Movie.find({}).select(["movieNm", "repGenreNm", "-_id"]).exec();
// movieNm과 reqGenreNm 필드만 가져오고 _id 필드는 제외
  • 문자열로 설정시 앞에 -를 붙이면 제외되고 객체로 사용할때는 값을 0으로 설정하면 제외된다.
    movieNm reqGenreNm -_id"
    ["movieNm", "reqGenreNm", "-_id"]
    {movieNm: 1, reqGenreNm: 1, _id: 0}

countDocuments, count

가져온 데이터의 갯수를 반환한다.

const cnt = await Movie.find({ repGenreNm: "액션" }).countDocuments();
// ...count();

skip, limit

가져올 데이터가 많을 경우 페이징 처리하는데 사용한다.

const result = await Movie.find({ repGenreNm: "액션" }).select("movieNm -_id").skip(3).limit(3);
// 가져온 데이터중에서 앞 3개는 건너뛰고 그 다음 3개의 도큐먼트를 가져온다.

sort

객체 형태나 문자열로 정렬 처리가 가능하다.

const result = await Movie.find({ repGenreNm: "액션" }).select("movieNm prdtYear openDt").sort("-prdtYear openDt").lean();
// mongoose find 결과는 mongodb 드라이버로 find 했을때와 다르게 모델 상태이므로 .lean()을 사용하여 Mongoose Model에서 Plain Javascript Object로 바꿔줘야함.
// 데이터 부분만 필요하다면 .lean()을 사용해서 메모리 절약 가능
  • 문자열로 설정시 앞에 -를 붙이면 내림차 정렬, 붙이지 않으면 오름차 정렬
  • 객체로 사용할때는 -1은 내림차순(desc), 1은 오름차순(asc)
    "-prdtYear openDt"
    {prdtYear: -1, openDt: 1}

distinct

특정 필드의 중복값은 제외하고 리스트를 반환합니다.

let result = await Movie.find({}).select("genreAlt -_id").distinct("repGenreNm");

Comparison Query (비교 쿼리)

MongoDB Comparison Query docs
https://www.mongodb.com/docs/manual/reference/operator/query-comparison/

where + gt, gte, lt, lte

greater than (or equal), less than (or equal)

// openDt가 20220801 이후인 데이터를 찾고싶을때
const result = await Movie.find({}).where("openDt").gte("20220801").select("movieNm openDt").lean();

// 체이닝을 사용하지 않고 find() 안에 넣어줄수도 있다.
const result = await Movie.find({ openDt: { $gte: "20220801" } }).select("movieNm openDt").lean();

where + in, nin

  • in: 필드의 값이 $in안에 들어가있는 값들 중 하나인 필드를 찾습니다.
  • nin: 필드의 값이 $nin 안에 값들이 아닌 필드를 찾습니다.
// reqGenreNm이 액션이거나 드라마인 데이터를 찾을때
const result2 = await Movie.find({}).where("repGenreNm").in(["액션", "드라마"]).lean();

// 체이닝을 사용하지 않고 find() 안에 사용할수도 있음.
const result2 = await Movie.find({ repGenreNm: { $in: ["액션", "드라마"] } }).lean();

Logical Query (논리 쿼리)

MongoDB Logical Query docs
https://www.mongodb.com/docs/manual/reference/operator/query-logical/

where + or

  • or: 여러 개의 조건 중에 적어도 하나를 만족하는 다큐먼트를 찾습니다.
// reqGenreNm이 액션이거나 드라마인 도큐먼트를 찾을때 (필드명은 여러개 설정 가능)
const result = await Movie.find({}).or([{ "reqGenreNm": "액션" }, { "reqGenreNm": "드라마" }]).lean();

// 체이닝을 사용하지 않고 find() 안에 사용할수도 있음.
const result = await Movie.find({ $or: [{ reqGenreNm: "액션" }, { reqGenreNm: "드라마" }] }).lean();
profile
그저 그런 개발 교육생

0개의 댓글