MongoDB에서 bulkWrite updateOne upsert에 대한 문법은 다음과 같습니다.
참고: 공식문서
const bulk = [
{
updateOne: {
filter: {},
update: {
$set: {},
$push: {},
...
},
upsert: true
}
}
]
db.collection.bulkWrite(bulk)
여기서 filter에 ObjectId, 즉 _id를 제외한 다른 필드를 넣는것은 문제될 게 없습니다.
하지만 _id로 필터링을 하면 문제가 생깁니다.
_id를 갖는 document가 없으면, 새로운 ObjectId를 갖는 document를 insert 하는 것이 아니라, 지정한 _id를 갖는 document를 insert합니다.
다음은 세가지 예시 코드입니다.
const bulk = [
{
updateOne: {
filter: {
_id: undefined // 1번
},
update: {
$set: {},
$push: {}
},
upsert: true
}
},
{
updateOne: {
filter: {
_id: null // 2번
},
update: {
$set: {},
$push: {}
},
upsert: true
}
},
{
updateOne: {
filter: {
_id: '' // 3번
},
update: {
$set: {},
$push: {}
},
upsert: true
}
}
]
db.collection.bulkWrite(bulk)
이 세 updateOne의 결과는 다음과 같습니다.
// 1, 2번 동일
{
_id: null,
...
},
// 3번
{
_id: "",
...
}
이 때문에, _id로 upsert를 하는 상황이 생긴다면 코드상에서 조건문으로 insert, update 나눠주는 것이 좋을것같습니다.
'Database' 카테고리의 다른 글
[Real MySQL 8.0] 아키텍처 - MySQL 엔진 아키텍처 (0) | 2023.09.05 |
---|---|
[Real MySQL 8.0] 사용자 및 권한 (0) | 2023.09.01 |
[Real MySQL 8.0] mysql 설치와 설정 (0) | 2023.08.28 |
[친절한 SQL 튜닝] NDV, 선택도 (Selectivity), 카디널리티 (Cardinality) (0) | 2023.08.16 |