SMAIVNN
article thumbnail
Published 2023. 3. 15. 22:16
[mongoDB] 갱신 연산자 Database

 

도큐먼트의 특정 부분만 갱신할 때 갱신 연산자를 사용한다.

 

$set

필드 값을 설정한다, 필드가 존재하지 않으면 새 필드를 생성한다.

model.updateOne(
{},
{"$set" : {"newField" : "thisIsNew" }} // 새로운 필드 생성
)

model.updateOne(
{},
{"$set" : {"newField" : "chageField" }} // 필드 내용 변경
)

model.updateOne(
{},
{"$set" : {"author.name" : "johnDoe" }} // 내장 도큐먼트 이용시
)

 

$inc

키의 값을 증가시킨다. 키가 없다면 새 필드 생성 후 해당 값 만큼 0에서 더한다.

$set과 비슷하지만 숫자를 증감하기 위해 존재한다.

model.updateOne(
{},
{"$inc" : {"score" : 1}} // score의 값을 1 증가시킨다.
)

 

배열 연산자

$push

배열 끝에 새로운 요소를 삽입한다. 만약 존재하지 않는다면 새로운 배열을 생성한다.

추가하는 값이 배열일 경우 배열 안에 배열 [1,2,[3,4]]가 생성될 수 있다. 해결을 위해서는 $each를 사용한다.

// comment : []
model.updateOne(
{},
{"$push" : {"comment" : {"name" : "smaivnn", "message" : "this is new comment"}}}
)

 

$each

한 번에 여러 값을 추가할 수 있다. $push, $addToSet과 자주 함께 이용한다.

// comment : [value0]
model.updateOne(
{},
{"$push" : {"comment" : {"$each" : [<value1>, <value2>, <value3>]}}}
)
// comment : [value0, <value1>, <value2>, <value3>]

 

$slice

배열을 특정 길이로 유지한다.

$slice나 $sort를 $Push와 함께 쓰려면 $each를 반드시 포함해야한다.

// 배열의 값을 10개로 유지한다. 10보다 길어질 경우 마지막 10개 요소만 유지된다.
// 도큐먼트 내에 큐를 생성하는데 사용 가능하다.
model.updateOne(
{},
{"$push" : {"comment" : {"$each" : [<value1>, <value2>, <value3>],
						 "$slice" : -10} }}
)

 

$sort

배열 내 요소를 정렬한다.

$slice나 $sort를 $Push와 함께 쓰려면 $each를 반드시 포함해야한다.

// "rating" 필드로 배열의 모든 요소를 정렬한 후 처음 10개 요소를 유지한다.
// $slice나 $sort를 $Push와 함께 쓰려면 $each를 반드시 포함해야한다.
model.updateOne(
{},
{"$push" : {"comment" : {"$each" : [{"rating" : 6.6}, {"rating" : 4.3}],
						 "$slice" : -10,
                         "$sort" : "rating" : -1} }}
)

 

$addToSet

특정 값이 배열에 존재하지 않을 때에만 중복을 피해 값을 추가한다. 

 

// comment : []에 smaivnn이 없다면 추가한다.
model.updateOne(
{},
{"$addToSet" : {"comment" : "smaivnn"}}
)
// comment : ["smaivnn"]

 

$each와 함께 사용해서 고유한 값을 여러 개 추가할 수 있다.

// comment : []에 smaivnn이 없다면 추가한다.
model.updateOne(
{},
{"$addToSet" : {"comment" : ["smaivnn", "potpae", "minn"]}}
)
// comment : ["smaivnn", "potpae", "minn"]

 

$pop

배열에 맨 앞 / 맨 뒤 요소를 제거한다. 

{ $pop: { "key" : 1 } }은 배열의 마지막 요소를 제거하고

{ $pop: { "key" : -1 } }는 배열의 처음 요소를 제거한다. 이 때 내부적으로 shift 시킨다.

model.updateOne(
{},
{ $pop: { "key" : -1 } }
)

 

$pull

배열에서 조건에 맞는 특정 요소를 제거한다.

// name : ["smaivnn", "potpae"]
model.updateOne(
{},
{ "$pull" : { "name" : "smaivnn" } }
)
// name : ["potpae"]

 

$ (위치 연산자)

블로그 게시물, 댓글 등 배열의 특정 위치의 요소를 변경해야 하는 경우가 있다.

이 때, 첫 번째 요소를 변경하고자 하면 아래와 같이 한다.

// comments : []의 0번째 index의 like 항목을 1 증가시킨다.
model.updateOne(
{},
{ "$inc" : {"comments.0.like" : 1} }
)

하지만 특정한 상황을 제외하고는 위치를 알기 쉽지 않다. 이 때 요소의 위치를 알아내어 갱신하는

$를 사용한다.

// comments : [] 내의 author : john이라는 유저의 이름을 jim으로 갱신한다.
// 하지만 이는 첫 번째로 일치하는 요소만 갱신한다.
model.updateOne(
{"comments.author" : "john"},
{"$set" : {"comments.$.author" : "jim"}}
)

 

$[ ], arrayFilters

일치하는 모든 배열 요소를 업데이트한다. 예시 코드는 mongoDB 공식 Docs에서 가져왔다.

아래와 같은 자료가 있다고 가정하다.

{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 100 ] }
{ "_id" : 3, "grades" : [ 95, 100, 100 ] }

이 상태에서 grades에서 특정 조건을 통해 모두 값을 변경하고 싶다면 아래와 같이 이용하다.

// 배열 내 값이 100이 넘는 값을 모두 100으로 set한다.
model.updateMany(
   { },
   { $set: { "grades.$[element]" : 100 } },
   { arrayFilters: [ { "element": { $gte: 100 } } ] }
)

arrayFilters에 관해서 조금 더 자세히 알고자 한다면 mongoDB 공식 Docs의 $[<식별자>]를 참고하자.

 

 

본 게시물은 한빛미디어의 <MongoDB The Definitive Guide 몽고DB 완벽 가이드 3>을 요약 정리했습니다.

'Database' 카테고리의 다른 글

[mongoDB] 집계 프레임워크  (0) 2023.03.25
[mongoDB] 인덱스  (0) 2023.03.24
[mongoDB] 쿼리  (0) 2023.03.17
profile

SMAIVNN

@SMAIVNN

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!