MongoDB 파헤치기 - 4

2019-05-18

UPDATE 작업

Update 작업에는 3가지 정도 이용할 수 있습니다.

  • db.collection.updateOne(<filter>, <update>, <options>)
  • db.collection.updateMany(<filter>, <update>, <options>)
  • db.collection.replaceOne(<filter>, <update>, <options>)

Update를 공부하기전에 먼저 Update를 할 대상들을 Insert를 해주도록 하겠습니다.

다음의 명령어를 MongoDB Shell에 입력해주세요.

db.inventory.insertMany( [
   { item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
   { item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
   { 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" },
   { item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );

db.collection.updateOne()

db.collection.updateOne() 는 하나의 문서를 업데이트하는 메소드 입니다.

inventory 에 있는 item 이 paper인 문서를 업데이트 해보겠습니다.

db.inventory.updateOne(
   { item: "paper" },
   {
     $set: { "size.uom": "cm", status: "P" },
     $currentDate: { lastModified: true }
   }
)
  • $set 을 이용해서 size.uom 필드에 cm이란 값을 줬고, status 필드에 P라는 값을 주었습니다.

  • $currentData 를 이용해서 현재 필드에 존재하는 lastModified 에 값을 변경했습니다.

    만약 lastModified 란 필드가 존재하지 않으면, $currentData 는 필드를 생성합니다.

Update가 정상적으로 된 모습

{ "_id" : ObjectId("5ce127a7d424b8caf621d0a1"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "cm" }, "status" : "P", "lastModified" : ISODate("2019-05-19T09:55:24.592Z") }

db.collection.updateMany()

db.collection.updateMany() 는 여러 개의 문서를 업데이트하는 메소드 입니다.

qty 값이 50보다 작은 문서들을 업데이트 해보겠습니다.

db.inventory.updateMany(
   { "qty": { $lt: 50 } },
   {
     $set: { "size.uom": "in", status: "P" },
     $currentDate: { lastModified: true }
   }
)

db.collection.replaceOne()

_id 필드를 제외한 나머지의 모든 것을 변경하고 싶으면, db.collection.replaceOne() 을 이용하여

두번째 인자로 새로운 문서들을 넘겨주면 됩니다.

바뀔 문서는 반드시 필드/값 쌍으로 이루어져야 하며. $currentData 같은 update 연산자를 사용하면 안됩니다.

변경될 문서는 원래의 문서와 다른 필드가 작성되도 됩니다. (여기서 NoSQL의 장점이 들어납니다.)

문서를 바꿀 때 _id 필드는 변경하지 않는걸 볼 수 있는데요,

그 이유는 _id 필드는 변경할 수 없기(immutable) 때문입니다.

DELETE 작업

delete 작업에는 두가지 정도 메소드를 이용할 수 있습니다.

  • db.collection.deleteMany()
  • db.collection.deleteOne()

db.collection.deleteMany()

db.collection.deleteMany() 는 만약 빈 배열인 { } 를 주게되면 모든 문서를 삭제합니다.

db.inventory.deleteMany({})

모든 문서를 찾는 db.inventory.find({}) 와 같죠?

조건과 일치하는 모든 문서 삭제하기

모든 문서를 삭제하면 안되기 때문에 조건이나 필터를 지정해 줄 수 있습니다.

필터는 READ 동작에서 이용했던 것처럼 사용합니다.

동등 조건을 주기 위해서는 <field>:<value> 표현식을 사용합니다.

이런 필터들을 쿼리 필터 라고 부릅니다. 쿼리필터에대해 더 알아보기

{ <field1> : <value1> , ...}

지정한 조건을 만족하는 문서를 삭제하고 싶으면 deleteMany() 메소드한테 인자로 filter를 넘겨주면 됩니다.

다음은 inventory 컬렉션에 있고, status가 “A” 인 문서를 삭제하는 예제 입니다.

db.inventory.deleteMany({ status : "A" })

조건에 일치하는 문서들 중에 하나만 삭제하기

삭제를 할 때, 조건에 만족하는 문서가 여러개 있습니다.

전부를 삭제하지 않고, 하나만 삭제하고 싶으면 db.collection.deleteOne() 메소드를 이용하면 됩니다.

다음은 status가 D 인 것 중에 처음 나오는 문서를 삭제하는 예제입니다.

db.inventory.deleteOne( { status: "D" } )