안녕하세요. 마지막으로 배열 수정 연산자에 대하여 알아보겠습니다. 연산자가 참 많죠? 다 외우기 힘드니까 필요한 것은 그때그때 찾아보면 됩니다. 몽고DB에서는 배열이 많이 쓰이기 때문에 배열 관련된 연산자가 많습니다.
배열 수정 연산자
$
투사 연산자로 쓰이는 $가 아니라 배열을 수정할 때 쓰이는 연산자입니다. list: [1, 2, 3] 이라는 필드가 있다고 칩시다.
db.zero.update({ list: 2 }, { 'list.$': 5 }) // list: [1, 5, 3]
위의 쿼리를 통해 두 번째 요소를 바꿀 수 있습니다. 즉 찾은 값의 위치를 기억하는 연산자입니다.
$addToSet
배열필드에 해당 요소가 없으면 추가하고 있으면 아무것도 하지 않습니다. 몽고DB에서 자체적으로 배열에 해당 요소가 있는지 검사해주기 때문에 편합니다.
{ $addToSet: { 필드1: 값, 필드2: 값, ... } }
$pop
배열 메소드처럼 몽고DB 배열에서 맨 앞 또는 맨 뒤 요소를 꺼내는 겁니다. shift와 pop을 합쳐놓은 연산자입니다. -1 값은 shift 기능, 1 값은 pop 기능을 합니다.
{ $pop: { 필드1: ±1, 필드2: ±1, ... } }
$pull
배열에서 조건을 만족하는 특정한 요소를 꺼냅니다. 꺼내는 조건은 쿼리 연산자와 같습니다.
{ $pull: { 조건1, 조건2, ... } }
$pullAll
$pull 연산자와는 달리 $pullAll은 조건이 아니라 그냥 일치하는 값을 배열에서 꺼냅니다.
{ $pullAll: { 필드: [값1, 값2, ...] } }
$push
배열 필드에 값을 push합니다.
{ $push: { 필드1: 값, 필드2: 값, ... } }
조심해야할 것은 값이 배열일 경우 한 번에 push해버립니다. 만약 원래 [1, 2]라는 배열이 있다면 [3, 4, 5]를 push할 경우 [1, 2, [3, 4, 5]]가 되어버립니다. 3, 4, 5를 따로따로 push하고 싶다면
{ $push: { 필드: { $each: 배열 } } }
해야 합니다.
$each
방금 위에서도 사용되었습니다. 다른 용례로 $addToSet과 같이 사용하는 경우가 있습니다. $addToSet도 $push처럼 한 번에 배열을 집어넣기 때문에 따로따로 넣고 싶다면
{ $addToSet: { 필드: { $each: 배열 } } }
해야 합니다.
$slice
투사 연산자에서 나왔던 $slice인데요. 그 때 $slice는 보여줄 때만 일부 추려서 보여준거라면, 지금의 $slice는 배열을 $push할 때 개수를 제한할 수 있습니다. 또한 반드시 $each과 함께 사용되어야 합니다.
{ $push: { 필드: { $each: 배열, $slice: 숫자 } } }
숫자가 양수면 처음부터 숫자만큼, 음수면 마지막에서부터 숫자만큼만 저장합니다. 예를 들어 필드에 [1, 2, 3]이 있었고, $each로 [4, 5, 6]을 넣는데 $slice의 숫자가 -5면 마지막에서 5개만 저장하기 때문에 [1, 2, 3, 4, 5, 6]에서 [2, 3, 4, 5, 6]이 저장됩니다. 만약 처음에 [4, 5, 6]이 있었고 $each로 [1, 2, 3]을 넣는데 $slice가 4면 [1, 2, 3, 4]만 저장됩니다.
$sort
배열의 요소들을 정렬하는 연산자입니다. $sort 또한 $push를 보조하는 역할로 사용됩니다. 그리고 $each와 함께 사용되어야 합니다.
{ $push: { 필드: { $each: 배열, $sort: { 정렬기준 } } }
정렬기준은 1이면 오름차순, -1이면 내림차순입니다. 만약 배열 안에 객체가 있다면 정렬 기준으로 { 객체필드: ±1 } 하면 됩니다.
$position
역시 $push를 보조하는 역할로 사용되고, $each와 함께 사용되어야 합니다. $push할 위치를 지정하는 역할을 합니다.
{ $push: { 필드: { $each: 배열, $position: 위치 } }
만약 기존에 [1, 2, 3]이 있고, $each로 추가할 배열이 [4, 5, 6]이며 $position이 0이면 [4, 5, 6, 1, 2, 3]이 됩니다. 만약 $position이 2면, [1, 2, 4, 5, 6, 3]이 됩니다.
다음 시간은 인덱스(Index)에 대해서 알아보겠습니다.
$addToSet처럼 배열에서 각 요소가 있는지 검사하나요?