개발/MongoDB

[MongoDB][M001] Chapter3: Creating and Manipulating Documents

nova_dev 2022. 10. 1. 17:00
반응형

Chapter 3: Creating and Manipulating Documents

 

M001: MongoDB Basics | MongoDB University

In this course you will learn how to set up your database and start exploring different ways to search, create, and analyze your data with MongoDB. We will cover database performance basics, and discover how to get started with creating applications and vi

university.mongodb.com

아래 내용은 MongoDB에서 무료로 제공하는 MongoDB University의 M001: MongoDB Basics의 Chapter 3을 공부하며 정리한 내용이다.

1. Lecture: Inserting New Documents

  • _id
    • 모든 document들에는 unique한 _id가 있음
    • ObjectId()은 _id필드의 default value임. (따로 지정하지 않을 경우 ObjectId 타입 사용)
    • _id만 다르고 다른 값들은 모두 동일한 document가 있을 수 있음.
    • 자동 생성되는 고유한 값

1.1 Quiz: ObjectId

2. Lecture: Inserting New Documents - Insert() and errors

  • db.{collection_name}.findOne();
    • 컬렉션의 문서 형식 같은 것을 보기 좋음.
    • 일반적으로 검색할 경우 필터 조건을 넣어 find()를 사용하고 findOne은 사용하지 않음. findOne을 사용하면 해당 조건에 유일한 document인지를 모르기 때문.
  • db.{collection_name}.insert({})
db.inspections.findOne(); ## 도큐먼트 하나를 확인해서 전부 복사해옴.

db.inspections.insert({ ## Duplication error가 발생함. _id가 동일한 도큐먼트 존재
      "_id" : ObjectId("56d61033a378eccde8a8354f"),
      "id" : "10021-2015-ENFO",
      "certificate_number" : 9278806,
      "business_name" : "ATLIXCO DELI GROCERY INC.",
      "date" : "Feb 20 2015",
      "result" : "No Violation Issued",
      "sector" : "Cigarette Retail Dealer - 127",
      "address" : {
              "city" : "RIDGEWOOD",
              "zip" : 11385,
              "street" : "MENAHAN ST",
              "number" : 1712
         }
  })

db.inspections.insert({ ## _id를 추가하지 않으면 자동으로 _id를 추가해서 데이터를 넣어줌.
      "id" : "10021-2015-ENFO",
      "certificate_number" : 9278806,
      "business_name" : "ATLIXCO DELI GROCERY INC.",
      "date" : "Feb 20 2015",
      "result" : "No Violation Issued",
      "sector" : "Cigarette Retail Dealer - 127",
      "address" : {
              "city" : "RIDGEWOOD",
              "zip" : 11385,
              "street" : "MENAHAN ST",
              "number" : 1712
         }
  })

db.inspections.find({"id" : "10021-2015-ENFO", "certificate_number" : 9278806}).pretty() ## _id만 다른 도큐먼트가 두개 존재함.

2.1 Quiz: Insert Errors

3. Lecture: Inserting New Documents - Insert() order

여러 도큐먼트를 insert 하려면?

db.inspections.insert([ { "test": 1 }, { "test": 2 }, { "test": 3 } ])

위와 같이 넣으면 3개의 도큐먼트가 들어간다.

동일한 쿼리를 한번 더 던져도 _id를 각각 unique 한 값으로 자동 생성해주므로 duplicate error는 발생하지 않고 정상적으로 들어간다.

db.inspections.insert([{ "_id": 1, "test": 1 },{ "_id": 1, "test": 2 },
                       { "_id": 3, "test": 3 }])

만약 위와 같이 _id를 직접적으로 명시해서 넣는다면?

첫 번째 test:1 값만 들어간 뒤 2번을 넣을 때 duplicate 에러가 발생하면서 데이터가 들어가지 않는다.

3번은 다른 _id를 가진 도큐먼트였는데, 순서대로 넣다가 실패한 뒤로 들어가지 않았다.

만약 실패한 doucment 외에 다른 것들은 정상적으로 넣고 싶다면?

db.inspections.insert([{ "_id": 1, "test": 1 },{ "_id": 1, "test": 2 },
                       { "_id": 3, "test": 3 }],{ "ordered": false })

위와 같이 ordered false 옵션을 넣어주면 된다.

이렇게 넣게 되면, _id가 동일한 1번과 2번은 duplication 에러가 발생하면서 들어가지 않고, 3번만 들어가게 된다.

또 하나의 document를 넣어보자.

db.inspection.insert([{ "_id": 1, "test": 1 },{ "_id": 3, "test": 3 }])

오잉? 실행해보면 성공한다. 왜일까?

바로, ‘inspections’가 아닌 ‘inspection’으로 오타가 났기 때문.

mongoDB는 존재하지 않는 collection에 document를 삽입해도 정상적으로 데이터가 들어간다. (자동으로 collection을 생성한다!)

만약 use training 로 존재하지 않는 training이라는 컬렉션을 사용해도, 정상 동작한다.

그런데 만약 위 명령어를 입력한 뒤에 아무런 document를 삽입하지 않는다면, collection은 생성되지 않는다.

3.1 Quiz: Insert Order

4. Lecture: Updating Documents - Data Explorer

Atlas Data explorer에서 도큐먼트를 수정할 수 있는 기능도 있음.

4.1 Quiz: Updating Documents

5. Lecture: Updating Documents - Mongo shell

  • inc
    • {"$inc" : {"pop" : 10, "<field>": <increment value>, ...}}
    • field value를 특정한 양만큼 증가시킨다.
  • set
    • {"$set" : {"pop" : 17630, "<field>": <increment value>, ...}}
    • field value를 특정 값으로 바꾼다.
  • push
    • {"$push" : {<field1" : <value1>, ...}}
    • array field에 element를 추가한다.
## 사용할 컬렉션으로 이동
use sample_training 

## city가 "HUDSON"인 document 갯수 조회
db.zips.find({ "city": "HUDSON" }).count()

## 16개의 모든 document의 인구수를 10만큼 증가시킨다.
db.zips.updateMany({ "city": "HUDSON" }, { "$inc": { "pop": 10 } })

## 이제 허드슨 도시의 인구를 17630으로 업데이트 해보자.
db.zips.updateOne({ "zip": "12534" }, { "$set": { "pop": 17630 } })

## 만약 pop이라는 필드를 잘못쳐서 population으로 입력했어도 정상적으로 들어가며, 없는 값은 새로 만든다.
db.zips.updateOne({ "zip": "12534" }, { "$set": { "population": 17630 } })

## student의 성적에 새로운 점수를 입력해보자. scores는 점수의 array로 저장되어 있는 값이다.
db.grades.updateOne({ "student_id": 250, "class_id": 339 },
                    { "$push": { "scores": { "type": "extra credit",
                                             "score": 100 }
                                }
                     })

5.1 Quiz: Updating Documents in the shell

5. Lecture: Deleting Documents and Collections

  • 만약 유일한 document임을 보장하고 싶다면 _id로 찾는 것을 추천함.
  • db.<collection>.drop() - 컬렉션 삭제 시 사용
  • deleteOne(), deleteMany() - 매칭 되는 document를 삭제할 때 사용함.
  • 삭제한 데이터는 완전히 사라지므로 명령어 사용 시 주의할 것.

5.1 Quiz: Deleting Documents

5.2 Quiz: Deleting Documents

참고자료

 

M001: MongoDB Basics | MongoDB University

In this course you will learn how to set up your database and start exploring different ways to search, create, and analyze your data with MongoDB. We will cover database performance basics, and discover how to get started with creating applications and vi

university.mongodb.com

 

반응형