강의를 듣다가
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
찾아봤더니 mongoose의 sort()는 앞에 cursor값이 와야한다
보통 find()가 cursor값을 반환하는듯
cursor가 무엇인지는 정확하게 알기 어려웠다...
아무튼 그럼 cursor를 반환하는 것이 sort앞에 와야한다는건데
그럼 또 다른 궁금함
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();
같은 동작을 하는 코드이다
시간도 결국 비슷하게 걸릴 것 같다
취향에 맞는 걸루 쓰자...