[mongoDB] CRUD - update

y___h·2023년 4월 16일
0

현재 진행중인 다이어리&스케줄러 프로젝트 진행하던 중, 1년 치의 데이터 객체를 수정 시엔 어떻게 db에 반영할 수 있는 지 감이 잡히지 않았다.

mongoDB 공식문서에서 데이터 안에 있는 배열이나 객체에 접근하여 수정하는 방법에 대해 알아보았다.

https://www.mongodb.com/docs/manual/reference/method/db.collection.update/

업데이트 연산자 식($inc 및 $set) 사용

문서에 $set 한정자를 사용하는 것과 같은 update 연산자 한정자가 포함되어 있으면 다음과 같습니다.

  • 문서에는 업데이트 연산자 식만 포함해야 합니다.
    db.collection.update() 메서드는 문서의 해당 필드만 업데이트합니다.

  • 포함된 문서 또는 전체 배열을 업데이트하려면 필드의 대체 값을 지정합니다.

  • 포함된 문서 또는 배열의 특정 필드를 업데이트하려면 점 표기법을 사용하여 필드를 지정합니다.

예시코드


db.books.insertMany([
  {
    "_id" : 1,
    "item" : "TBD",
    "stock" : 0,
    "info" : { "publisher" : "1111", "pages" : 430 },
    "tags" : [ "technology", "computer" ],
    "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "lmn", "rating" : 5 } ],
    "reorder" : false
   },
   {
    "_id" : 2,
    "item" : "XYZ123",
    "stock" : 15,
    "info" : { "publisher" : "5555", "pages" : 150 },
    "tags" : [ ],
    "ratings" : [ { "by" : "xyz", "rating" : 5 } ],
    "reorder" : false
   }
]);
  

update 사용


db.books.update(
   { _id: 1 },
   {
     $inc: { stock: 5 },
     $set: {
       item: "ABC123",
       "info.publisher": "2222",
       tags: [ "software" ],
       "ratings.1": { by: "xyz", rating: 3 }
     }
   }
)

  • The parameter of { id: 1 } specifies which document to update,
    { id: 1 }를 통해 동일한 id를 가진 document를 선택(특정)함.

  • the $inc operator increments the stock field, and
    _ stock filed를 증가시키는 method $inc를 이용.

  • the $set operator replaces the value of the item field,
    publisher field in the info embedded document,
    tags field, and second element in the ratings array.
    item 부분, info의 publisher 부분, tags, ratings array의 두번째 요소들을 변경

수정된 부분

  
{
  "_id" : 1,
  "item" : "ABC123",
 ✔️"stock" : 5,
 ✔️"info" : { "publisher" : "2222", "pages" : 430 },
  
 ✔️"tags" : [ "software" ],
  "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "xyz", "rating" : 3 } ],
  "reorder" : false
}
  
  

조건문 사용방법

 // INVALID
[
 { "x.a": { $gt: 85 } },
 { "x.b": { $gt: 80 } }
]
// VALID

 // Example 1
[
 { $or: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] }
]
// Example 2
[
 { $and: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] }
]
// Example 3
[
 { "x.a": { $gt: 85 }, "x.b": { $gt: 80 } }
]

여긴 다시 공부하기
https://www.mongodb.com/docs/manual/reference/method/db.collection.updateOne/#mongodb-method-db.collection.updateOne

students2 콜렉션 안에 '객체'들을 추가하고

db.students2.insertMany( [
   {
      "_id" : 1,
      "grades" : [
         { "grade" : 80, "mean" : 75, "std" : 6 },
         { "grade" : 85, "mean" : 90, "std" : 4 },
         { "grade" : 85, "mean" : 85, "std" : 6 }
      ]
   },
  
  
   {
      "_id" : 2,
      "grades" : [
         { "grade" : 90, "mean" : 75, "std" : 6 },
         { "grade" : 87, "mean" : 90, "std" : 3 },
         { "grade" : 85, "mean" : 85, "std" : 4 }
      ]
   }
] )

grades.grade가 85이상 이면 grades 안의 "mean"을 100으로 바꿔보자.

db.students2.updateOne(
   { }, // 모든 객체
   { $set: { "grades.$[elem].mean" : 100 } },
   { arrayFilters: [ { "elem.grade": { $gte: 85 } } ] } //  grades.grade가 85이상이면 ! 
)

결과

{
   "_id" : 1,
   "grades" : [
      { "grade" : 80, "mean" : 75, "std" : 6 },
   !! { "grade" : 85, "mean" : 100, "std" : 4 },
   !! { "grade" : 85, "mean" : 100, "std" : 6 }
    ]
}

{
   "_id" : 2,
   "grades" : [
      { "grade" : 90, "mean" : 75, "std" : 6 },
      { "grade" : 87, "mean" : 90, "std" : 3 },
      { "grade" : 85, "mean" : 85, "std" : 4 }
   ]
} // 변화 없음

filter에 걸린 첫번째 객체만 내용이 바뀐 것을 알 수 있다.

profile
기록 이사중 🐣

0개의 댓글