[1] CRUD Operations
1. INSERT
1) 한 개의 document
- db.컬렉션명.insertOne( {필드명1: 값1, 필드명2: 값2,... } )
- JSON 객체 하나( { } )를 매개변수로 넣어준다.
ex) db.inventory.insertOne(
{ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
2) 여러 개의 document
- db.컬렉션명.insertMany( [ {필드명1: 값1-1, 필드명2: 값2-1,...}, {필드명1: 값1-2, 필드명2: 값2-2,...},...] )
- JSON 객체가 여러 개 들어가 있는 배열( [ ] )을 매개변수로 넣어준다.
ex) db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])
3) 한 개 혹은 여러 개
- db.컬렉션명.insert(객체or배열)
예시 출처 - https://www.mongodb.com/docs/v3.6/crud/
2. UPDATE
- 매개변수
① 필터 : {조건필드:값}
② 변경내용 : { Update Operator : {변경필드:값} }
- $set : 해당 필드의 값을 변경, 업데이트할 필드가 존재하지 않으면 필드를 추가하고 값을 넣어준다.
- $inc : 지정한 값 만큼 필드의 값을 증감, 필드가 존재하지 않으면 필드를 추가하고 값을 넣어준다.
- $set, $inc 외에도 다양한 Update Operator 존재
Update Operators — MongoDB Manual
Docs Home → MongoDB ManualThe following modifiers are available for use in update operations, for example, in db.collection.updateMany() and db.collection.findAndModify().Specify the operator expression in a document of the form:{ : { : , ... }, : { : ,
www.mongodb.com
③ 옵션 : {옵션명: 옵션값}
- update 할 때 기본으로 설정된 기능을 변경하고 싶은 경우 사용
- {multi : true} => 조건에 만족하는 모든 document를 찾아서 필드 값을 변경
- multi 외에도 다양한 옵션이 존재
1) 한 개의 document
- db.컬렉션명.updateOne(필터, 변경내용, 옵션)
- 필터로 찾은 document가 여러 개일 경우에도 첫 번째 document 하나만 수정
ex) db.inventory.updateOne(
{ item: "paper" },
{
$set: { "size.uom": "cm", status: "P" },
$currentDate: { lastModified: true }
}
)
예시 출처 - https://www.mongodb.com/docs/v3.6/crud/
2) 여러 개의 document
- db.컬렉션명.updateMany(필터, 변경내용, 옵션)
- 필터로 찾은 document를 모두 수정
ex) db.inventory.updateMany(
{ "qty": { $lt: 50 } },
{
$set: { "size.uom": "in", status: "P" },
$currentDate: { lastModified: true }
}
)
예시 출처 - https://www.mongodb.com/docs/v3.6/crud/
3) 한 개의 document 교체
- db.컬렉션명.replaceOne(필터, 교체내용, 옵션)
- _id를 제외한 내용이 통째로 교체된다.
- 교체내용에는 Update Operator를 사용하지 않는다.
ex) db.inventory.replaceOne(
{ item: "paper" },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)
예시 출처 - https://www.mongodb.com/docs/v3.6/crud/
4) 한 개의 document 수정 혹은 교체, 여러 개의 document 수정
- db.컬렉션명.update(필터, 변경내용 or 교체내용, 옵션)
- multi 옵션 생략 시 default로 한 개의 document 수정/교체, multi 옵션 선택 시 여러 document 수정 가능
ex) db.emp.update({id:"kim"}, {$set: {pass:"123456789"}}, {multi:true})
- Update Operator를 명시하지 않으면 replace 가 수행됨
ex1) id가 kang인 사람의 dept를 "총무"로 변경 (id는 unique하다고 가정)
=> db.score.update({id: "kang"}, {$set: {dept: "총무"}})
ex2) dept가 "전산"인 모든 사람들의 addr를 "안양"으로 변경
=> db.score.update({dept: "전산"}, {$set:{addr: "안양"}}, {multi: true})
ex3) id가 jang인 document의 bonus를 1000 추가하기 (id는 unique하다고 가정)
=> db.score.update({id: "jang"}, {$inc: {bonus: 1000}})
ex4) dept가 총무인 모든 document에 bonus를 2000 추가하기
=> db.score.update({dept: "총무"}, {$inc: {bonus: 2000}}, {multi: true})
5) 배열 데이터
① 배열데이터 추가
ex) db.score.update({id:"jang"}, {$set:{favorites:{city: ["서울", "안산"], movie: ["겨울왕국2", "변호인"]}}})
② 배열데이터 수정(요소 추가/제거)
[배열 Update Operator]
- $push : 배열에 요소를 추가(중복O)
ex) db.score.update({id: "jang"}, {$push: {"favorites.city": "천안"}})
- $each : 배열에 여러 개의 요소를 추가 시 $push와 함께 사용
ex1) db.score.update({id: "jang"}, {$push: {"favorites.city": ["천안", "가평", "수원"]}})
=> 배열의 요소로 배열 자체가 들어간다. 따라서 각각이 요소로 들어가게 하려면 $each 사용
ex2) db.score.update({id: "jang"}, {$push: {"favorites.city": {$each: ["천안", "가평", "수원"]}}})
- $sort : $push, $each와 함께 사용되어, 배열을 정렬 ( 1: 오름차순, -1: 내림차순 )
ex1) db.score.update({id: "jang"}, {$push: {"favorites.city": {$each: ["천안", "가평", "수원"], $sort: 1}}})
ex2) db.score.update({id: "jang"}, {$push: {"favorites.city": {$each: ["천안", "가평", "수원"], $sort: -1}}})
- $addToSet : 배열에 요소를 추가(중복X)
ex) db.score.update({id: "jang"}, {$addToSet: {"favorites.city": "인천"}})
- $pop : 배열의 첫 번째 요소(-1) or 마지막 요소(1)를 제거
ex1) db.score.update({id: "jang"}, {$pop: {"favorites.city": 1}})
ex2) db.score.update({id: "jang"}, {$pop: {"favorites.city": -1}})
- $pull : 배열의 요소들 중 원하는 요소 한 가지를 제거(중복된 것 모두)
ex) db.score.update({id: "jang"}, {$pull: {"favorites.city": "천안"}})
- $pullAll : 배열의 요소들 중 원하는 요소 여러 개를 제거(중복된 것 모두)
ex1) db.score.update({id: "jang"}, {$pull: {"favorites.city": ["천안","가평"]}})
=> 리스트 자체가 요소로 들어가 있지 않은 이상, 실행X
ex2) db.score.update({id: "jang"}, {$pullAll: {"favorites.city": ["천안","가평"]}})
[배열 update 연습]
1. song,jang,hong에 다음과 같은 값을 가질 수 있도록 배열로 필드를 추가하세요
song : history (영업1팀, 총무, 기획실)
jang: history(전략팀,총무,전산)
hong : history(영업1팀, 기획실,전산)
- set 사용
db.score.update({id: "song"}, {$set: {history: ["영업1팀", "총무", "기획실"]}})
db.score.update({id: "jang"}, {$set: {history: ["전략팀", "총무", "전산"]}})
db.score.update({id: "hong"}, {$set: {history: ["영업1팀", "기획실", "전산"]}})
- push 사용
db.score.update({id: "song"}, {$push: {history: {$each: ["영업1팀", "총무", "기획실"]}}})
db.score.update({id: "jang"}, {$push: {history: {$each: ["전략팀", "총무", "전산"]}}})
db.score.update({id: "hong"}, {$push: {history: {$each: ["영업1팀", "기획실", "전산"]}}})
2. song의 document history에 자금부를 추가하세요
db.score.update({id: "song"}, {$push: {history: "자금부"}})
3. jang의 document의 history에 마지막 데이터를 제거하세요
db.score.update({id: "jang"}, {$pop: {history: 1}})
4. servlet데이터가 100점인 모든 document에 bonus를 3000을 추가하세요. 기존데이터가 존재하면 증가되도록 구현하세요
db.score.update({servlet: 100}, {$inc: {bonus: 3000}}, {multi: true})
5. song의 lang.ms에 "visual basic","asp",".net"을 한꺼번에 추가하세요
- push 사용
db.score.update({id: "song"}, {$push: {"lang.ms": {$each: ["visual basic", "asp", ".net"]}}})
- set 사용
db.score.update({id: "song"}, {$set: {lang: {ms: ["visual basic", "asp", ".net"]}}})
[collection 생성, insert, update 연습]
1. board 컬렉션을 생성
db.createCollection("board")
2. document는 5개 insert
no,id,title,content,count,writedate
db.board.insert([
{no: 1, id: "id01", title: "title01", content: "content01", count: 1, writedate: new Date()},
{no: 2, id: "id02", title: "title02", content: "content02", count: 2, writedate: new Date()},
{no: 3, id: "id03", title: "title03", content: "content03", count: 3, writedate: new Date()},
{no: 4, id: "id04", title: "title04", content: "content04", count: 4, writedate: new Date()},
{no: 5, id: "id05", title: "title05", content: "content05", count: 5, writedate: new Date()}
])
3. 2번째 게시물에는 댓글이 3개 추가되도록 update문으로 작업하기
* 하위object와 배열로 구성
* 댓글의 필드
no, content,count1,count2,writedate
db.board.update(
{no: 2},
{$set: {comment: [
{no: 1, content: "comment01", count1: 1, count2: 2, writedate: new Date()},
{no: 2, content: "comment02", count1: 2, count2: 3, writedate: new Date()},
{no: 3, content: "comment03", count1: 3, count2: 4, writedate: new Date()},
]
}
}
)
6) 필드명 변경
- $rename : {기존 필드명: 변경 필드명}
- 필드명 변경 시 사용하는 Update Operator
- 최상위 document의 필드명 변경
ex) db.students.updateOne( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' } } )
- embedded document의 필드명 변경
ex) db.students.updateOne( { _id: 1 }, { $rename: { "name.first": "name.fname" } } )
예시 출처 - https://www.mongodb.com/docs/v3.6/crud/
- 끝 -
'프로젝트형 IoT 서비스 개발 4회차 > 3. 게이트웨이 디바이스 제어' 카테고리의 다른 글
[Day49] 2022-04-07(목) MongoDB4 - Aggregation, PyMongo Setting - 김서연 강사님 (0) | 2022.04.07 |
---|---|
[Day48] 2022-04-06(수) MongoDB3 - CRUD2(QUERY, DELETE) - 김서연 강사님 (0) | 2022.04.06 |
[Day46] 2022-04-04(월) MongoDB1 - 설치 및 기본사용법 - 김서연 강사님 (0) | 2022.04.04 |
[Day46] 2022-04-04(월) 라즈베리파이 준비2 - 무선인터넷 설정 - 김서연 강사님 (0) | 2022.04.04 |
[Day45] 2022-04-01(금) 라즈베리파이 준비1 - SD카드 포맷, 라즈베리파이OS 이미지 굽기 - 김서연 강사님 (1) | 2022.04.01 |