본문 바로가기

프로젝트형 IoT 서비스 개발 4회차/3. 게이트웨이 디바이스 제어

[Day47] 2022-04-05(화) MongoDB2 - CRUD1(INSERT, UPDATE) - 김서연 강사님

728x90

[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 존재

https://www.mongodb.com/docs/manual/reference/operator/update/?_ga=2.162427963.645641283.1649049214-213561962.1649049214 

 

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/

 

- 끝 -

728x90