도큐먼트의 특정 부분만 갱신할 때 갱신 연산자를 사용한다.
$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 |