[과제] MongoDB _01

💜 문제 01 💜

inventory 컬렉션을 생성하자.

[
   { "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
   { "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
   { "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
   { "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
   { "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
]

해당 데이터를 CMD 창이나 MongoDB Compass 를 이용하여 데이터베이스에 추가한 다음, 캡쳐화면과 같은 결과가 나오도록 해보자!

1) status 필드가 "D" 인 모든 도큐먼트를 검색한 다음
2) size 필드의 h, w 프로퍼티 값을 이용하여 status 필드에 그대로 복사해서
3) status 필드값이 배열이 되도록 해보자!

(단, updateOne 대신에 updateMany 메서드를 사용해야 한다. )


MongoDB Campass로 추가 하는 과정

CMD로 추가하는 과정

이제 조건에 맞춰 문제를 풀어보자.

1) status 필드가 "D" 인 모든 도큐먼트를 검색한다.

find 메서드를 이용해 status 필드가 "D" 인 도큐먼트를 검색해보자.

입력어는 다음과 같다.

2) size 필드의 h, w 프로퍼티 값을 이용하여 status 필드에 그대로 복사한다. 그리고 status 의 필드값을 배열로 바꾼다.

이를 위해서 우리는 데이터 값을 업데이트 해줘야 한다.

현재 MongoDB campass 에서 본 도큐먼트의 상태는 이렇다.

만약 하나의 값만 바꾸고 싶으면 이런 식으로 입력하면 된다.

db.[컬렉션 이름].updateOne(
{필터:필터값},
{$set: {바꾸고 싶은 필드 : 값}}
)

나는 다음처럼 입력했다.

item의 값이 "journal"인 도큐먼트를 찾아서 status의 상태를 배열로 바꾼 것이다.

결과값은 이렇다.

그러나 문제의 조건은 하나의 값을 입력하는게 아니라 여러 값을 입력해야하는 것이다.

여러 값을 업데이트 하기 위해서는 반.드.시. updateOne 대신에 updateMany 메서드를 사용해야 한다.

이 메서드를 사용하는 방법은 다음과 같다.

db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        // Available starting in MongoDB 4.2.1
   }
)

mdn은 여전히 참 불친절하다.


해매고 있다가 결국 교수님께 질문을 드렸다.

조건 속에 답이 있었다. 아래 조건에 주목하자.

size 필드의 h, w 프로퍼티 값을 이용하여 status 필드에 그대로 복사한다.

맙소사. 이걸 간과하고 있었다.

cmd 창으로 가자.

다음을 입력한다.

결과는 이렇다.

모든 도큐먼트의 status 상태가 배열로 고쳐졌다!

하지만 문제가 있다. size의 값이 제대로 불려들여지지 않는 것이다.
나는 이 부분을 고치고 싶다.

그리고 코드를 뜯어본 결과 다음과 같은 문제점이 있다는 것을 깨달았다.

$size.w, $size.h 라는 필드의 값을 읽으려면 반드시 배열([]) 구문 안에 { $set: } 구문이 들어있어야 한다.

즉,

db.inventory.updateMany(
   { },
   [
      { $set: { status: ["$size.w","$size.h"]}},
   ]
)

위 코드 처럼 대괄호[]가 있어야 하는 것이다.

...

위 처럼 입력하자.

그러면 다름과 같이 정상적으로 바뀌어 있다는 것을 알 수 있다.

좋은 웹페이지 즐겨찾기