mongoose findOne().sort() 를 이해하기 위한 여정

Jean·2023년 6월 20일
0
post-custom-banner

findOne에 sort를 왜 해?

강의를 듣다가

const maxOrderByUserId = await Todo.findOne().sort("-order").exec();

이런 코드를 발견
해당 코드는 order를 기준으로 내림차순하여 가장 order 값이 큰 데이터를 가져오는 코드다

하지만 이제까지 순서대로 왼쪽-> 오른쪽으로 읽어와서 findOne() 이 정말 이해가 안 갔다
하나를 뽑아내는데 거기서 정렬을...????

그래서 다음과 같은 코드를 실험해보기로 함

  const maxOrderByUserId = await Todo.sort("-order").findOne().exec();

바로 오류 등장

TypeError: Todo.sort is not a function

cursor...?

찾아봤더니 mongoose의 sort()는 앞에 cursor값이 와야한다
보통 find()가 cursor값을 반환하는듯
cursor가 무엇인지는 정확하게 알기 어려웠다...
아무튼 그럼 cursor를 반환하는 것이 sort앞에 와야한다는건데

차라리 find sort limit은 어때

그럼 또 다른 궁금함
findOne은 값 하나를 뽑아내기 위함인데
그렇다면 find에 limit을 해도 같은 것 아닌가..?

  const maxOrderByUserId = await Todo.find().sort("-order").limit(1).exec();

그런데 오류났다....

ValidationError: Todo validation failed: order: Cast to Number failed for value "NaN" (type number) at path "order"

maxOrderByUserId.order값이 number가 아니고 undefined로 나온다..

아니 진짜 왜지...?

맨 위의 강의 코드에서는 타입이 number로 나오는데....

const maxOrderByUserId = await Todo.find()
console.log(typeof maxOrderByUserId.order); //undefined


const maxOrderByUserId = await Todo.findOne()
console.log(typeof maxOrderByUserId.order); //number

멍청이

이해가 영 안되어서 여기저기 질문하고 다녔는데

어...?

const maxOrderByUserId = await Todo.find()
console.log(typeof maxOrderByUserId[0].order); //number

어..?

와 진짜 멍청했따...

결론

const maxOrderByUserId = await Todo.find().sort("-order").limit(1).exec();
const maxOrderByUserId = await Todo.findOne().sort("-order").exec();

같은 동작을 하는 코드이다
시간도 결국 비슷하게 걸릴 것 같다
취향에 맞는 걸루 쓰자...

profile
햇내기 개발자 지망생
post-custom-banner

0개의 댓글