시작하며
금번 회사에서 진행하는 신규 프로젝트에서 MongoDB를 사용함에 따라서, MongoDB 학습중에 정리한 사항을 남겨봅니다.
모든 내용의 기반은 아래 문헌을 참고하였습니다. 또한 아래 글의 내용 중에 틀린 내용이 있을 수 있습니다.
참고문헌
몽고DB 완벽가이드 | 한빛미디어
https://product.kyobobook.co.kr/detail/S000001810370
CRUD 사용법 보기
배열 연산자란?
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 |