본문 바로가기

verdantjuly/Today I Learned

TIL 20230619

728x90

 

Event

9:00 발제

19:30 ~21:30 정예반 강의

 

생활 계획표

 

AM 6:00 체조, 아침식사, 산책, 샤워, 설거지, 세탁

AM 8:00 입실, TIL 리뷰, 노드 시간표 및 오늘 목표 체크

AM 8:30 공부 시작

PM 1:00 ~ 2:00 점심 식사

PM 6:00 ~ 7:00 저녁식사

PM 7:00 TIL, WIL 제출

PM 9:00 퇴실 (카톡 확인)

PM 11:00 취침

 

이번 주 목표

월 : 노드 숙련 3-8까지 (최소 3-4시간 이상 소요, 몰입!!)

화 : 노드 숙련 완강

수 : Lv.2

목 : Lv.3

금 : 제출

오늘 목표

TIL 작성

TIL 리뷰

노드 숙련 최소 3-8

오늘 한 것

TIL 작성

TIL 리뷰

노드 숙련 강의 3-1. 미들웨어 7:41

1. sort("-order") 메서드보다 findOne() 이 앞에 오는 이유

문제

// 작동
const alltodos = require("../models/todo");
const maxOrderByUserId = await alltodos.findOne().sort("-order")
// 오류
const alltodos = require("../models/todo");
const maxOrderByUserId = await alltodos.sort("-order").findOne()

나의 상식으로는 sort를 먼저 하고 findOne을 하는 게 맞았으나 mongoDB는 그렇지 않았다.

시도

동기에게 전달 받은 공식 문서를 꼼꼼히 살펴 보았다. 

 

Cursor.sort()
https://www.mongodb.com/docs/manual/reference/method/cursor.sort/

Cursors
https://www.mongodb.com/docs/v3.0/core/cursors/#cursor-behaviors

Models
https://mongoosejs.com/docs/models.html

Query
https://mongoosejs.com/docs/api/query.html#Query.prototype.sort()

findOne()
http://stitch-docs-old.s3-website-us-east-1.amazonaws.com/mongodb/actions/collection.findOne/

 

해결

const alltodos = require("../models/todo");
const maxOrderByUserId = await alltodos.findOne().sort("-order")

이 식에서 findOne()은 안이 비어 있는 경우에 첫 번째 document를 반환합니다.

이 식에서 sort(“-order“)는 cursor.sort()를 사용한 것입니다.

 

cursor는 find query를 실행했을 때의 return 값입니다.
안에 있는 문자열은 mongoose 내에서 실행되는 method 기능의 일부입니다.
원래는 오름차순 정렬이나 -를 붙이면 내림차순 정렬이 됩니다.

 

일반 js에서의 sort를 생각하면 findOne() 이전에 와도 될 것 같지만,
findOne() 이전의 alltodos는 model 이기 때문에 cursor에 해당하지 않습니다.


그래서 다음과 같이 작성하는 경우 식이 작동하지 않습니다.

const alltodos = require("../models/todo");
const maxOrderByUserId = await alltodos.sort("-order").findOne()

이 경우에는 cursor 가 앞에 없는 sort를 함수로 해석하려고 하여 작동하지 않습니다.

알게된 것

이해가 안 가는 코드가 있다면 공식 문서를 항상 찾아봐야 한다. 


정리 

mongoDB에서의 findOne() 첫 번째 document를 반환.

mongoDB에서의 cursor.sort() 는 꼭 cursor앞에서 사용해야 하며 안의 기준은 문자열이 와도 상관 없다.

문자열 따옴표 안에 -를 붙이면 내림차순으로 정렬된다.

cursor는 find query를 실행했을 때의 return 값.

 

체크리스트

[ O ] 예쁜 말로 협업하였는가?

[ O ] 12시간 동안 몰입하였는가?

[ O ] 코딩 시 복사 + 붙여넣기를 하지 않았는가?

[ O ] 친절한 개발자였는가?

[ X ] 오늘을 평가하였을 때 주니어 개발자가 될 수 있겠는가?

실력이 부족하다.

소감

처음에는 울면서 캠프를 수강하셨다는 게 이해가 안 되었는데 나도 울면서 할 것 같다. 

 

 

'verdantjuly > Today I Learned' 카테고리의 다른 글

TIL 20230621  (0) 2023.06.21
TIL 20230620  (0) 2023.06.20
TIL 20230618  (0) 2023.06.18
TIL 20230617  (0) 2023.06.17
TIL 20230616  (0) 2023.06.16