[DB] MongoDB CRUD

somin·2021년 9월 3일
1

Database

목록 보기
8/8

CREATE

  • 새로운 도큐먼트를 추가할 때 _id 값에 임의적으로 고유한 값을 생성해서 사용할 수도 있지만 보통은 ObjectId 타입(12byte, 24char)의 값으로 사용
    *각 도큐먼트는 고유한 _id 값을 가지고 있어야 함
  • _id 필드와 값을 특정하지 않았다면, 자동적으로 _id 필드가 생성되고 값에 ObjectId 타입이 할당
  • 존재하지 않는 컬렉션에 도큐먼트를 넣는 경우, 그와 동시에 컬렉션이 만들어지게 됨

1. 과정

mongo shell을 사용하여 컬렉션에 새로운 도큐먼트 추가하기

  • 터미널을 사용해 아틀라스 클러스터에 연결하고, MongoDB에서 제공하는 샘플 데이터를 받아옴
  • 사용하려는 데이터베이스로 이동후 컬렉션 확인
    *show dbs > use database > show collections으로 컬렉션 확인
  • 작성된 도큐먼트 확인
{
  "_id":ObjectId("5c8ecccqcaa187d17ca6ed16"),
  "city":"ALPINE",
  "zip":"35014",
  "loc":{
    "y":33.331165,
    "x":86.208934
  },
  "pop":3062,
  "state":"AL"
}
  • 해당 도큐먼트를 MongoDB 샘플 데이터베이스 중 하나인 zips 컬렉션에 삽입
    *db.zips.insert({})

2. insert()

응답 : WriteResult

  • nInserted : 삽입된 도큐먼트의 수를 의미
    *0일 경우 삽입 실패를 의미
  • writeError : 삽입 실패시 해당 원인 출력
  • insert를 이용하여 도큐먼트를 삽입 하기 위해서는 shell에 작성된 것과 같이 insert( )의 괄호 안에 삽입하고자 하는 도큐먼트를 json 형식으로 작성
    *shell에 작성된 것에서 _id는 삭제 : 기본 값으로 ObjectId를 생성하여 할당
  • 명령어에 따른 결과물이 하단에 WriteResult로 출력
  • 다수의 도큐먼트를 삽입시 배열 안에 삽입하고자 하는 객체들을 담아줌
    *db.collection_name.insert([{}, {}])
  • 기본적으로 인덱스 순서대로 작업을 진행해 duplicate key 에러가 나오는 순간 작업은 중단되지만 ordered 옵션을 사용하면 순서에 상관없이 고유한 _id를 가지는 모든 도큐먼트는 컬렉션에 추가됨
    *db.collection_name.insert([{}, {}], {"ordered":false})

READ

1. 과정

  • 터미널로 아틀라스 클러스터에 접속
  • 미리 받아둔 MongoDB에서 샘플로 제공하는 데이터베이스 리스트를 터미널에서 확인
  • 사용하려는 데이터베이스로 이동후 컬렉션 확인
    *show dbs > use database > show collections
  • 컬렉션 중 zips라고 되어 있는 컬렉션에서 데이터를 읽어보기
    *db.zips.find({})

2. find()

  • db.collection_name.find({})
  • {} 안에는 찾고자 하는 조건을 json 형식의 쿼리문으로 작성
  • find 명령어를 조건 쿼리문 없이 사용하면 해당 데이터베이스의 모든 데이터를 조회
    *db.collection_name.find()
  • 결과물 : JSON 형식으로 화면에 출력
    *화면에는 실제 결과물이 모두 출력되는 것이 아닌, 랜덤하게 선택된 총 20개 결과물만 출력
  • 해당 조건에 맞는 다음 20개의 도큐먼트를 조회하기 위해서는 iterate의 줄임말인 it 명령어를 사용

1) pretty()

  • 도큐먼트의 구조와 각 필드, 값의 쌍을 조금 더 읽기 편하게 출력하려면 pretty() 사용
    *db.collection_name.find().pretty()

2) count()

  • 데이터의 수를 조회하기 위해서는 count() 명령어 사용
    *db.collection_name.find().count()

3. findOne()

  • db.collection_name.findOne({})
  • 도큐먼트를 구별하는 고유한 값인 _id를 조건을 주어 데이터를 특정할 수 있음
  • 조건 쿼리문을 작성하지 않은 상태의 findOne()을 사용하면 무작위의 데이터 1개만 가져올 수도 있음
    *db.collection_name.findOne()

UPDATE

응답

  • matchedCount : 첫번째 인자로 들어간 조건을 충족하는 도큐먼트의 수
  • modifiedCount : 업데이트 연산자로 인해 수정된 도큐먼트의 수

1. updateOne()

  • 주어진 기준에 맞는 다수의 도큐먼트 중 첫번째 도큐먼트 하나만 업데이트
  • db.collection_name.updateOne({}, {})
  • 첫번째 인자는 어떤 도큐먼트를 업데이트 할지 결정하는 쿼리문이 작성
  • 두번째 인자는 발생할 업데이트 내용을 특정

2. updateMany()

  • 쿼리문과 일치하는 모든 도큐멘트를 업데이트
  • db.collection_name.updateMany({}, {})
  • 첫번째 인자는 어떤 도큐먼트를 업데이트 할지 결정하는 쿼리문이 작성
  • 두번째 인자는 발생할 업데이트 내용을 특정

3. 업데이트 연산자

1) $set

  • $set 연산자를 사용하면 주어진 필드에 지정된 값을 업데이트할 수 있음
db.collection_name.updateOne({"zip":"12534"}, {"$set":{"pop":6235}})
// {“zip”: “12534”}에 해당하는 도큐먼트의 pop 필드가 지정한 값인 6235로 변경

2) $inc

  • $inc 연산자를 사용하면 특정 필드의 값을 원하는 만큼 증가시킬 수 있음
db.collection_name.updateMany({"city":"ALPINE"}, {"$inc":{"pop":10}})
// city가 ALPINE인 모든 도큐먼트의 pop 필드를 10만큼 씩 증가시킴

3) $push

  • 배열로 이루어진 필드의 값에 요소를 추가하기 위한 연산자
db.collection_name.updateOne({"student_id":250, "class_id":339},
{"push":{"scores":{"type":"extra credit", "score":100}}})
// {"student_id":250, "class_id":339} : 업데이트할 도큐먼트 조건
// "scores" : 서브 도큐먼트를 삽입할 배열 타입의 값을 가지고 있는 필드
// {"type":"extra credit", "score":100} : 추가할 서브 도큐먼트

DELETE

1. DELETE 도큐먼트

응답

  • acknowledged : 삭제된 경우 true
  • deletedCount : 삭제된 항목의 수

1) deleteOne()

  • 주어진 기준에 맞는 다수의 도큐먼트 중 첫번째 도큐먼트 하나를 삭제
  • _id 값으로 쿼리해 온 도큐먼트를 삭제하는 것이 좋은 접근법
  • 만약 _id 값으로 쿼리를 하지 않는다면, 검색 쿼리문에 다양한 도큐먼트가 적합할 수 있기 때문
  • db.collection_name.deleteOne({})

2) deleteMany()

  • 쿼리문과 일치하는 모든 도큐먼트를 삭제
  • db.collection_name.deleteMany({})

2. DELETE 컬렉션

응답

  • Boolean : 삭제된 경우 true

1) drop()

  • 컬렉션을 삭제하기 위해서는 drop이라는 명령어를 사용
  • db.collection_name.drop()
profile
✏️

0개의 댓글