- Mongoose의 기본적인 CRUD 방법을 알아야함.
몽고DB에서 자주 사용할법한 쿼리 빌더 기능들만 정리할 예정
명시하지 않으면 모든 필드를 가져오고, 설정 값에따라서 원하는 필드만 가져오거나 제외할 수 있다.
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}
가져온 데이터의 갯수를 반환한다.
const cnt = await Movie.find({ repGenreNm: "액션" }).countDocuments();
// ...count();
가져올 데이터가 많을 경우 페이징 처리하는데 사용한다.
const result = await Movie.find({ repGenreNm: "액션" }).select("movieNm -_id").skip(3).limit(3);
// 가져온 데이터중에서 앞 3개는 건너뛰고 그 다음 3개의 도큐먼트를 가져온다.
객체 형태나 문자열로 정렬 처리가 가능하다.
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}
특정 필드의 중복값은 제외하고 리스트를 반환합니다.
let result = await Movie.find({}).select("genreAlt -_id").distinct("repGenreNm");
MongoDB Comparison Query docs
https://www.mongodb.com/docs/manual/reference/operator/query-comparison/
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();
- in: 필드의 값이 $in안에 들어가있는 값들 중 하나인 필드를 찾습니다.
- nin: 필드의 값이 $nin 안에 값들이 아닌 필드를 찾습니다.
// reqGenreNm이 액션이거나 드라마인 데이터를 찾을때
const result2 = await Movie.find({}).where("repGenreNm").in(["액션", "드라마"]).lean();
// 체이닝을 사용하지 않고 find() 안에 사용할수도 있음.
const result2 = await Movie.find({ repGenreNm: { $in: ["액션", "드라마"] } }).lean();
MongoDB Logical Query docs
https://www.mongodb.com/docs/manual/reference/operator/query-logical/
- or: 여러 개의 조건 중에 적어도 하나를 만족하는 다큐먼트를 찾습니다.
// reqGenreNm이 액션이거나 드라마인 도큐먼트를 찾을때 (필드명은 여러개 설정 가능)
const result = await Movie.find({}).or([{ "reqGenreNm": "액션" }, { "reqGenreNm": "드라마" }]).lean();
// 체이닝을 사용하지 않고 find() 안에 사용할수도 있음.
const result = await Movie.find({ $or: [{ reqGenreNm: "액션" }, { reqGenreNm: "드라마" }] }).lean();