Database

MongoDB에서 bulkWrite updateOne upsert를 할 때 filter: _id 주의점

꼰딩 2023. 3. 28. 22:56

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 나눠주는 것이 좋을것같습니다.