MongoDB에 Query를 사용해서 데이터를 읽어보자

Jamie·2020년 12월 2일
0

MongoDB

목록 보기
7/8
post-thumbnail

선행작업

mongoDB 접속

$ mongosh mongodb://localhost:27017/admin?authSource=admin --username jamie

데이터 추가 MongoDB에 여러 데이터를 넣어보자(Insert & Import)

testDB 접근

$ mongosh mongodb://localhost:27017/testDB?authSource=admin --username jamie
Enter password: ***********

> use testDB
switched to db testDB

Collection의 특정 Document 검색하기

1. 조건 하나

  • 필터 기준을 적용해서 Collection에서 특정 Document를 검색할 수 있음
    > db.inventory.find( { status: "D" } )
    [
      {
        _id: ObjectId("5fc73f0993426845fee7ba6c"),
        item: 'paper',
        qty: 100,
        size: { h: 8.5, w: 11, uom: 'in' },
        status: 'D'
      },
      {
        _id: ObjectId("5fc73f0993426845fee7ba6d"),
        item: 'planner',
        qty: 75,
        size: { h: 22.85, w: 30, uom: 'cm' },
        status: 'D'
      }
    ]
  • 기본적으로 Shell은 20개의 문서만 표시하고 Cursor를 반환함

2. 조건 여러개 - ,(쉼표)로 연결

  • 쉼표로 조건을 연결해두면 AND 조건으로 적용된다!
    > myCursor = db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
    [
      {
        _id: ObjectId("5fc73f0993426845fee7ba69"),
        item: 'journal',
        qty: 25,
        size: { h: 14, w: 21, uom: 'cm' },
        status: 'A'
      }
    ]

3. 중첩 필드 조건 - .(점) 이용

  • .을 이용하면 중첩 필드에도 조건을 걸 수 있다.

    • 예) size 필드 하위 필드인 uom 필드가 in 문자열인 경우
    > myCursor = db.inventory.find( { "size.uom": "in" } )
    [
      {
        _id: ObjectId("5fc73f0993426845fee7ba6b"),
        item: 'notebook',
        qty: 50,
        size: { h: 8.5, w: 11, uom: 'in' },
        status: 'A'
      },
      {
        _id: ObjectId("5fc73f0993426845fee7ba6c"),
        item: 'paper',
        qty: 100,
        size: { h: 8.5, w: 11, uom: 'in' },
        status: 'D'
      }
    ]

결과 집합이 20개 초과인 경우 테스트

$ cat numbers.json 
{"no" : 1}
{"no" : 2}
{"no" : 3}
{"no" : 4}
{"no" : 5}
{"no" : 6}
{"no" : 7}
{"no" : 8}
{"no" : 9}
{"no" : 10}
{"no" : 11}
{"no" : 12}
{"no" : 13}
{"no" : 14}
{"no" : 15}
{"no" : 16}
{"no" : 17}
{"no" : 18}
{"no" : 19}
{"no" : 20}
{"no" : 21}
{"no" : 22}
{"no" : 23}
{"no" : 24}
{"no" : 25}
{"no" : 26}
{"no" : 27}
{"no" : 28}
{"no" : 29}
{"no" : 30}
{"no" : 31}
{"no" : 32}
{"no" : 33}
{"no" : 34}
{"no" : 35}
{"no" : 36}
{"no" : 37}
{"no" : 38}
{"no" : 39}
{"no" : 40}
{"no" : 41}

$ mongoimport --db testDB --collection numbers --authenticationDatabase admin --username jamie --file ./inventory.json
Enter password:

2020-12-02T17:17:47.161+0900	connected to: mongodb://localhost/
2020-12-02T17:17:47.205+0900	41 document(s) imported successfully. 0 document(s) failed to import.

$ mongosh mongodb://localhost:27017/testDB?authSource=admin --username jamie
Enter password: ***********

# 20개만 조회함을 확인할 수 있음
> numberCursor = db.numbers.find({})
[
  { _id: ObjectId("5fc74dfa956cbf5449f7b66c"), no: 1 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b66d"), no: 3 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b66e"), no: 4 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b66f"), no: 7 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b670"), no: 6 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b671"), no: 5 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b672"), no: 8 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b673"), no: 9 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b674"), no: 10 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b675"), no: 13 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b676"), no: 2 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b677"), no: 14 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b678"), no: 16 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b679"), no: 15 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b67a"), no: 11 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b67b"), no: 17 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b67c"), no: 18 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b67d"), no: 21 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b67e"), no: 20 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b67f"), no: 19 }
]

# 그렇다면 Cursor를 확인해보자 - 아까 조회한 값
> numberCursor
[
  { _id: ObjectId("5fc74dfa956cbf5449f7b66c"), no: 1 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b66d"), no: 3 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b66e"), no: 4 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b66f"), no: 7 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b670"), no: 6 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b671"), no: 5 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b672"), no: 8 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b673"), no: 9 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b674"), no: 10 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b675"), no: 13 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b676"), no: 2 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b677"), no: 14 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b678"), no: 16 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b679"), no: 15 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b67a"), no: 11 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b67b"), no: 17 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b67c"), no: 18 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b67d"), no: 21 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b67e"), no: 20 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b67f"), no: 19 }
]

# 반복 돌리기
> while (numberCursor.hasNext()) {
...    print(numberCursor.next());
...}
{ _id: ObjectId("5fc74dfa956cbf5449f7b680"), no: 22 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b681"), no: 23 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b682"), no: 24 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b683"), no: 25 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b684"), no: 26 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b685"), no: 27 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b686"), no: 28 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b687"), no: 29 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b688"), no: 31 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b689"), no: 32 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b68a"), no: 33 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b68b"), no: 34 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b68c"), no: 35 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b68d"), no: 36 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b68e"), no: 30 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b68f"), no: 39 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b690"), no: 37 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b691"), no: 40 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b692"), no: 41 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b693"), no: 38 }
{ _id: ObjectId("5fc74dfa956cbf5449f7b694"), no: 12 }

# 재시도
> while (numberCursor.hasNext()) {
...    print(numberCursor.next());
...}
MongoError: Cursor is closed

# numberCursor 재확인
> numberCursor
[
  { _id: ObjectId("5fc74dfa956cbf5449f7b66c"), no: 1 },
  { _id: ObjectId("5fc74dfa956cbf5449f7b66d"), no: 3 },
  # 생략 - 동일 조회
]
  • 위의 결과에서 알게 된 점
    • mongoimport는 순서 보장을 해주지 않았다
    • 조회시 20건까지 확인이 되고, (Cursor의 포인터) 그 이후는 Cursor를 반복 조회해야한다.
    • hasNext()와 next()로 반복하되, 한 번 조회하면 더이상 조회가 안되는 것 같다. 단, Cursor 포인터는 계속해서 조회할 수 있다(아마 10분정도..?)

출처

MongoDB 공식 가이드 - https://docs.mongodb.com/guides/server/read_queries/

profile
성장중인 제이미입니다.

0개의 댓글