AOC55

Backend, Devops, Cloud, kubernetes

BackEnd/MongoDB

MongoDB :: 배열 연산자 사용법

aoc55.soft@gmail.com 2022. 10. 12. 23:16

시작하며

금번 회사에서 진행하는 신규 프로젝트에서 MongoDB를 사용함에 따라서, MongoDB 학습중에 정리한 사항을 남겨봅니다.

모든 내용의 기반은 아래 문헌을 참고하였습니다. 또한 아래 글의 내용 중에 틀린 내용이 있을 수 있습니다.

 

참고문헌

몽고DB 완벽가이드  | 한빛미디어 

https://product.kyobobook.co.kr/detail/S000001810370

 

CRUD 사용법 보기

https://aoc55.tistory.com/55

 


 

배열 연산자란?

Document 에서 특정 필드에 대한 값이 배열일 경우, 해당 배열을 제어하기 위한 연산자를 의미합니다.

 

값이 배열인 경우 예시

db.student.findOne({"name":"aaa"})

// 실행결과
{
    "_id" : ObjectId("6346c4bd91691f34c1fec292"),
    "name" : "aaa",
    "arr" : [
        1.0,
        2.0,
        3.0
    ]
}

위 예시에서 student 라는 Collection에서,

name이 aaa인 Document가 arr이라는 필드에서 값으로 배열을 가지고 있는 것을 볼 수 있습니다.

 

 

참고사항

  • 참고로 배열 연산자($pop, $pull….)는 배열을 대상으로만 가능합니다.
  • 특정 필드에 대해서 배열이 아닌 스칼라 값은 $set, $unset, $inc … 등의 연산자를 활용합니다.

 

배열 요소 추가 (update + $push)

db.student.updateOne({"name":"bbb"}, {
     "$push" : {"arr": 888}
})
  • update 함수 내 연산자로 $push를 사용한다.
  • “arr”은 여기서 배열을 가지고 있는 해당 Document 내의 필드명을 의미하며, 888은 해당 필드 내 배열에 추가할 값이다.

 

 

배열 요소 반복 추가 (update + $push + $each)

db.student.updateOne({"name":"bbb"}, {
     "$push" : {
         "arr": {
             "$each" : [997, 998, 999]
         }
     }
})
  • 위의 배열에 값을 반복해서 추가하기.
  • update 함수 내 연산자로 $push 를 사용한다.
  • 그리고 반복해서 추가할 값이 담긴 배열을 지정한 후, $each 연산자를 사용해준다.
  • 즉, arr이라는 필드에 담긴 배열에 997. 998. 999을 반복적으로 배열에 push 하라는 것을 의미한다.

 

 

배열 요소 반복 추가 + Slicing (update + $push + $each + $slice)

db.student.updateOne({"name":"bbb"}, {
     "$push" : {
         "arr": {
             "$each" : [777, 778, 779],
             "$slice" : -4
         }
     }
})
  • 위의 배열에 반복해서 추가할 때 Slicing을 함께 적용하는 방식이다.
  • $slice에 Slice 할 값을 지정한다.
  • 즉, 예시는 arr이라는 필드에 담긴 배열에 777. 778. 779.을 각각 추가해주나, Slicing으로 배열의 역순으로 배열은 4개의 값만 가지도록 Slicing 한다.
  • 만약 "$slice" : 4 로 지정하게 되면, 배열의 처음부터 4개의 값만 가지도록 배열을 Slicing을 하는 것을 의미한다.

 

 

배열을 Set처럼 사용하기1

db.student.updateOne(
    {"arr" : {"$ne" : 99}},
    {"$push" : {"arr": 99}}
)
  • 첫번째 필터 파라미터로 배열에 해당 값이 없는 경우로 건다.
  • 그 다음에 $push 연산자를 통해서 해당 값을 추가해준다.
  • 즉, arr 필드에 들어있는 배열에 99 라는 값이 없을 경우에만 해당 배열에 push 하라는 것을 의미한다.

 

 

배열을 Set처럼 사용하기2 ($addToSet)

db.student.updateOne(
    {"name" : "bbb"},
    {"$addToSet" : {"arr": 100}}
)
  • update 함수 내 연산자로 $addToSet를 사용한다.
  • 지정한 배열 필드에 설정한 해당 Value가 없을 경우만 배열에 추가된다.
  • (사실상 위의 1과 동일한 동작을 의미한다)

 

 

배열 요소 제거하기 ($pop, $pull)

$pop

db.student.updateOne(
    {"name" : "bbb"},
    {"$pop" : {"arr": -1}}
)
  • update 함수 내 연산자로 $pop을 사용한다.
  • 양 끝에서부터 제거 하는데, 이때 제거 방향을 설정할 수 있다.
    • -1 이면 배열 내 처음 요소 부터 제거 (큐)
    • 1 이면 배열 내 마지막 요소 부터 제거 (스택)

$pull

db.student.updateOne(
    {"name" : "bbb"},
    {"$pull" : {"arr": 99}}
)
  • update 함수 내 연산자로 $pull을 사용한다.
  • $pop과 달리 지울 요소에 대한 조건을 지정한다.
  • 조건이 맞다면 갯수 상관없이 모두 지운다.

 

 

배열 내 위치 기반의 값 변경

db.student.updateOne(
    {"arr" : 5},
    {"$set" : {"arr.$": 555}}
)
  • update 함수 내 연산자로 $set을 사용한다.
  • 첫번째로 지정한 필터에 대해서 일치하는 배열 내 요소의 인덱스가 → $로 주입된다.
  • (단, 일치하는 요소가 복수개여도  $ 자체는 첫번째만 가르킨다)
  • 그 후 $이 가르키는 배열 내 요소를 대상으로 $set을 수행한다.

 

관련 주의사항

위 경우 여러개의 Document가 있을 경우,

만약 첫번째 Document 내의 arr 필드의 배열에 해당 요소가 있다면, 오직 첫번째 Document만 아래 $set 구문이 실행되고 종료됩니다.

즉, 동일하게 arr 필드에 해당 요소가 있는 다른 Docuemnt 들에 대해서는 $set 구문이 실행되지 않습니다.

 

또한 여기서 [첫번째, 두번째, 세번째] Document가 있고 모두 arr 필드 내 배열의 요소에 값이 모두 있는 상황에서,

두번째 Document에 대해서 Set 연산자를 동작시키고 싶으면,

Update 구문 내에서 추가적인 필터 파라미터를 통해서 두번째 Document를 지칭하면 될 듯 합니다.

db.student.updateOne(
    {
        "name": "bbb",
        "arr": 5
    },
    {"$set": {"arr.$": 555}}
)

 

 

 

 

'BackEnd > MongoDB' 카테고리의 다른 글

MongoDB :: Query 사용법  (0) 2022.10.22
MongoDB :: 기본 CRUD 사용법  (1) 2022.10.10