배열 내 숫자 조건으로 필터링: $elemMatch
배열 내의 숫자를 조건으로 필터링하기 위해선 MongoDB의 배열 쿼리 연산자인 $elemMatch를 사용해야 합니다.
# 초기 데이터
{
"name": "Kim",
"numbers": [5, 10, 15, 20, 25]
}
$elemMatch 사용하지 않은 경우
db.users.find({
numbers: {
$gte: 17,
$lte: 19
}
})
이 쿼리는 배열 안에 있는 요소들 중 17이상이고 19이하인 요소가 있는 document를 찾고싶습니다. 위 조건대로 본다면 요소엔 17이상 19이하인 요소는 없기 때문에 위 document는 포함되지 않아야한다 생각합니다.
하지만 결과는 위 document가 결과에 포함됩니다.
그 이유는 위 쿼리는 배열 내에 있는 각 요소를 각 조건에 따라 검사하기 때문입니다. 즉 17이상인 요소는 20, 25가 있고, 19이하인 요소는 5, 10, 15가 있기 때문에 위 document는 결과에 포함되게 됩니다.
$elemMatch 사용한 경우
db.users.find({
numbers: {
$elemMatch: {
$gte: 17,
$lte: 19
}
}
})
$elemMatch를 사용해주면 배열 내에 있는 각 요소들을 검사하며 17이상 19이하인 요소를 찾고 해당하는 요소가 없기 때문에 위 document는 결과에 포함되지 않게 됩니다.
배열 내 포함된 요소 찾기
# 초기 데이터
[
{
_id: ObjectId("65b8982ef19b9455c5b21915"),
name: 'hong',
numbers: [ 5, 10, 15, 20, 25 ]
},
{
_id: ObjectId("65b89ab4f19b9455c5b21916"),
name: 'hong',
numbers: [ 5, 10, 15, 20, 35 ]
}
]
위와 같은 document가 있습니다.
15 요소를 갖고 있는 document 찾기
# 15 요소를 갖고 있는 document 찾기
db.users.find({
numbers: 15
})
db.users.find({
numbers: { $all : [15]}
})
# 15와 20 요소를 갖고 있는 document 찾기
db.users.find({
numbers: { $all: [15, 20] }
})
# 15 요소만 갖고 있는 document 찾기
db.users.find({
numbers: [15]
})
# 15 또는 35 요소 중 하나라도 요소를 갖고 있는 document 찾기
db.users.find({
numbers: { $in : [15, 35]}
})
배열 내 요소 수정하기
# 초기 데이터
[
{ _id: 1, grades: [ 85, 95, 100 ] },
{ _id: 2, grades: [ 80, 90, 99 ] },
{ _id: 3, grades: [ 80, 83, 94 ] }
]
요소 하나 수정하기
처음 만나는 조건에 대한 document가 수정됩니다.
# 실행
db.users.updateOne(
{_id: 3, grades: 94},
{ $set: {"grades.$": 93}}
)
# 결과
[
{ _id: 1, grades: [ 85, 95, 100 ] },
{ _id: 2, grades: [ 80, 90, 93 ] },
{ _id: 3, grades: [ 80, 83, 94 ] }
]
모든 배열 요소 수정하기
# 실행
db.users.updateMany(
{},
{ $inc: {"grades.$[]": -10}}
)
# 결과
[
{ _id: 1, grades: [ 75, 85, 90 ] },
{ _id: 2, grades: [ 70, 80, 83 ] },
{ _id: 3, grades: [ 70, 73, 84 ] }
]
$[]: 배열을 표시하면 전체를 변경하겠다는 의미입니다.
조건에 대한 요소 수정하기
# 초기 데이터
[
{
_id: 1,
grades: [
{ kor: 75, math: 85, eng: 90 },
{ kor: 70, math: 80, eng: 83 },
{ kor: 70, math: 73, eng: 84 }
]
}
]
# 실행
db.class.updateMany(
{ _id: 1 },
{ $set: {"grades.$[element].kor": 100} },
{ arrayFilters: [{"element.eng": {$lte: 85}}] }
)
# 결과
[
{
_id: 1,
grades: [
{ kor: 75, math: 85, eng: 90 },
{ kor: 100, math: 80, eng: 83 },
{ kor: 100, math: 73, eng: 84 }
]
}
]
배열 요소 삽입하기
# 초기 데이터
[
{ _id: 1, grades: [ 75, 85, 90 ] },
{ _id: 2, grades: [ 70, 80, 83 ] },
{ _id: 3, grades: [ 70, 73, 84 ] }
]
요소 하나 삽입하기
# 실행
db.users.updateOne(
{ _id: 1},
{ $addToSet: {grades: 200}}
)
# 결과
[
{ _id: 1, grades: [ 75, 85, 90, 200 ] },
{ _id: 2, grades: [ 70, 80, 83 ] },
{ _id: 3, grades: [ 70, 73, 84 ] }
]
요소 두 개 이상 삽입하기
# 실행
db.users.updateOne(
{ _id: 1},
{ $addToSet: {grades: {$each: [0, 5] }}}
)
# 결과
[
{ _id: 1, grades: [ 75, 85, 90, 200, 0, 5 ] },
{ _id: 2, grades: [ 70, 80, 83 ] },
{ _id: 3, grades: [ 70, 73, 84 ] }
]
$each:
만약 해당 Operators를 붙이지 않는다면 [0, 5]라는 배열이 요소로 삽입되어 grades: [75, 85, 90, 200, [0, 5]]가 됐을 것입니다.
요소 삭제하기
# 실행
db.users.updateOne(
{ _id: 1},
{ $pull: {grades: 200}}
)
# 결과
[
{ _id: 1, grades: [ 75, 85, 90, 0, 5 ] },
{ _id: 2, grades: [ 70, 80, 83 ] },
{ _id: 3, grades: [ 70, 73, 84 ] }
]
요소 두 개 이상 삭제하기
요소 삽입과 다르게 $each를 사용하지 않고 $in Opertors를 사용하면 됩니다.
# 실행
db.users.updateOne(
{ _id: 1 },
{ $pull: {grades: { $in: [0, 85] }}}
)
# 결과
[
{ _id: 1, grades: [ 75, 90, 5 ] },
{ _id: 2, grades: [ 70, 80, 83 ] },
{ _id: 3, grades: [ 70, 73, 84 ] }
]
pop 사용하여 배열 양 끝 제거하기
# 실행
db.users.updateOne(
{ _id: 1 },
{ $pop: {grades: 1}}
)
# 결과
[
{ _id: 1, grades: [ 75, 90 ] },
{ _id: 2, grades: [ 70, 80, 83 ] },
{ _id: 3, grades: [ 70, 73, 84 ] }
]
$pop: 1인 경우 배열의 끝에서 요소를 제거하고, -1인 경우 배열의 시작에서 요소를 제거합니다.
push 사용하여 배열 마지막 요소에 넣기
# 실행
db.users.updateOne(
{ _id: 1 },
{ $push: {grades: 100}}
)
# 결과
[
{ _id: 1, grades: [ 75, 90, 100 ] },
{ _id: 2, grades: [ 70, 80, 83 ] },
{ _id: 3, grades: [ 70, 73, 84 ] }
]
- 삽입과 마찬가지로 여러 개의 요소를 넣는 경우 $each를 사용하면 됩니다.
- $position을 사용하여 배열의 마지막 요소가 아닌 넣은 위치를 지정할 수 있습니다.
'DBMS > MongoDB' 카테고리의 다른 글
MongoDB GROUP BY와 유사한 Aggregation (1) | 2024.01.31 |
---|---|
MongoDB MQL(MongoDB Query Language) (0) | 2024.01.30 |
MongoDB MongoDB 배포 형태: Replica Set & Sharded Cluster (0) | 2024.01.25 |
MongoDB MongoDB: 문서 지향 NoSQL (0) | 2024.01.23 |