Chapter 3: Creating and Manipulating Documents
아래 내용은 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
참고자료
'개발 > MongoDB' 카테고리의 다른 글
[MongoDB][M001] Chapter2 : Importing, Exporting, and Quering Data (0) | 2022.09.29 |
---|---|
[MongoDB][M001] Chapter1: MongoDB란? (0) | 2022.09.28 |
[MongoDB] MongoDB 공식 무료 강의로 MongoDB 학습하기 (0) | 2022.09.27 |
[MongoDB]MongoDB 인덱스 설계하기 (0) | 2021.07.11 |
[MongoDB] MongoDB 사용하기 (0) | 2021.05.09 |