Dev_from the Bottom

#30. MongoDB_05 : 커서(Cursor) 개념 / 기초 활용법 본문

Database

#30. MongoDB_05 : 커서(Cursor) 개념 / 기초 활용법

고무라면 2022. 6. 1. 06:49

1. 커서(Cursor)란?

  • MongoDB는 조회를 할 때, find( ) 명령어로 도큐먼트를 호출한다.
  • 내부적으로는 "커서(Cursor)"를 사용해 find의 결과를 반환한다.(혹은 'find의 결과로 Document 자체를 반환하지 않고 커서(객체)를 반환한다' 라고 표현하기도 함)
  • 커서는 쿼리 결과에 대한 '포인터'라고 할 수 있다.

2. 커서(Cursor) 사용 이유

  • 커서는 포인터. 즉, 도큐먼트(데이터)의 위치 정보가 들어가 있다.
  • 포인터를 통해 도큐먼트(데이터)를 빠르게 조회할 수 있다.
  • 도큐먼트(데이터)를 직접적으로 보여주는 것에 비해 편리성, 성능을 향상시킨다.

3. 커서(Cursor) 사용 예시

# 100개 데이터 생성
for(x=0; x<100;x++){db.col3.insertOne({"a":x})}

>>>
{ acknowledged: true,
  insertedId: ObjectId("629566123a5bcee96d63be28") }

# 출력
# 데이터를 한번에 보여주는 게 아니라, 잘라서 필요한 만큼만 보내준다(20개).
db.col3.find()

>>>
{ _id: ObjectId("629566113a5bcee96d63bdc5"), a: 0 }
{ _id: ObjectId("629566123a5bcee96d63bdc6"), a: 1 }
{ _id: ObjectId("629566123a5bcee96d63bdc7"), a: 2 }
{ _id: ObjectId("629566123a5bcee96d63bdc8"), a: 3 }
{ _id: ObjectId("629566123a5bcee96d63bdc9"), a: 4 }
{ _id: ObjectId("629566123a5bcee96d63bdca"), a: 5 }
{ _id: ObjectId("629566123a5bcee96d63bdcb"), a: 6 }
{ _id: ObjectId("629566123a5bcee96d63bdcc"), a: 7 }
{ _id: ObjectId("629566123a5bcee96d63bdcd"), a: 8 }
{ _id: ObjectId("629566123a5bcee96d63bdce"), a: 9 }
{ _id: ObjectId("629566123a5bcee96d63bdcf"), a: 10 }
{ _id: ObjectId("629566123a5bcee96d63bdd0"), a: 11 }
{ _id: ObjectId("629566123a5bcee96d63bdd1"), a: 12 }
{ _id: ObjectId("629566123a5bcee96d63bdd2"), a: 13 }
{ _id: ObjectId("629566123a5bcee96d63bdd3"), a: 14 }
{ _id: ObjectId("629566123a5bcee96d63bdd4"), a: 15 }
{ _id: ObjectId("629566123a5bcee96d63bdd5"), a: 16 }
{ _id: ObjectId("629566123a5bcee96d63bdd6"), a: 17 }
{ _id: ObjectId("629566123a5bcee96d63bdd7"), a: 18 }
{ _id: ObjectId("629566123a5bcee96d63bdd8"), a: 19 }
Type "it" for more

# 데이터(도큐먼트) 갯수 확인
db.col3.countDocuments()

>>>
100

# 커서 변수 생성 및 활용
var cursor = db.col3.find()   # cursor라는 변수에 결과를 할당함
cursor                        # 똑같이 20개 데이터 출력
>>>

{ _id: ObjectId("629566113a5bcee96d63bdc5"), a: 0 }
{ _id: ObjectId("629566123a5bcee96d63bdc6"), a: 1 }
{ _id: ObjectId("629566123a5bcee96d63bdc7"), a: 2 }
{ _id: ObjectId("629566123a5bcee96d63bdc8"), a: 3 }
{ _id: ObjectId("629566123a5bcee96d63bdc9"), a: 4 }
{ _id: ObjectId("629566123a5bcee96d63bdca"), a: 5 }
{ _id: ObjectId("629566123a5bcee96d63bdcb"), a: 6 }
{ _id: ObjectId("629566123a5bcee96d63bdcc"), a: 7 }
{ _id: ObjectId("629566123a5bcee96d63bdcd"), a: 8 }
{ _id: ObjectId("629566123a5bcee96d63bdce"), a: 9 }
{ _id: ObjectId("629566123a5bcee96d63bdcf"), a: 10 }
{ _id: ObjectId("629566123a5bcee96d63bdd0"), a: 11 }
{ _id: ObjectId("629566123a5bcee96d63bdd1"), a: 12 }
{ _id: ObjectId("629566123a5bcee96d63bdd2"), a: 13 }
{ _id: ObjectId("629566123a5bcee96d63bdd3"), a: 14 }
{ _id: ObjectId("629566123a5bcee96d63bdd4"), a: 15 }
{ _id: ObjectId("629566123a5bcee96d63bdd5"), a: 16 }
{ _id: ObjectId("629566123a5bcee96d63bdd6"), a: 17 }
{ _id: ObjectId("629566123a5bcee96d63bdd7"), a: 18 }
{ _id: ObjectId("629566123a5bcee96d63bdd8"), a: 19 }
Type "it" for more             # 'it'를 타이핑하면 뒤 데이터도 출력

# 다음 데이터(a:20)
cursor.next()
>>>

{ _id: ObjectId("629566123a5bcee96d63bdd9"), a: 20 }

# hasNext()
cursor.hasNext()

true    # 뒤 데이터가 있으면 true(반환할 데이터가 있다면). 마지막 데이터라면 false

# 배열 형태로 반환
cursor.toArray()      # 객체.메서드() 형태로 활용함

>>>       # 위에서 21까지 봤으니, 22부터 끝까지 반환 
[
  { _id: ObjectId("629566123a5bcee96d63bddb"), a: 22 },
  { _id: ObjectId("629566123a5bcee96d63bddc"), a: 23 },
  { _id: ObjectId("629566123a5bcee96d63bddd"), a: 24 },
  { _id: ObjectId("629566123a5bcee96d63bdde"), a: 25 },
  { _id: ObjectId("629566123a5bcee96d63bddf"), a: 26 },
  .......
  { _id: ObjectId("629566123a5bcee96d63be23"), a: 94 },
  { _id: ObjectId("629566123a5bcee96d63be24"), a: 95 },
  { _id: ObjectId("629566123a5bcee96d63be25"), a: 96 },
  { _id: ObjectId("629566123a5bcee96d63be26"), a: 97 },
  { _id: ObjectId("629566123a5bcee96d63be27"), a: 98 },
  { _id: ObjectId("629566123a5bcee96d63be28"), a: 99 }
]

 

4. 커서(Cursor) 사용 단점

  • 커서를 생성하고 10분이 지나면 비활성화됨(타임아웃이 10분)
  • 시간 제한을 없애려면, option을 추가해야 한다.
# 커서 제한 시간 없애기 : coCursorTimeout() 사용
var cursor = db.col3.find().noCursorTimeout()

# 이번에는 전체를 한번에 반환
cursor.toArray()

 

# 참고

  •  

 

Comments