MongoDB - null data handling

김상헌·2023년 3월 7일
0

데이터베이스

목록 보기
6/6

null 데이터에 대한 update 를 진행할 때 주의할 점을 알게 됩니다.

데이터 생성

use test
db.employees.insertOne({
    name: "lake",
    age: 21,
    dept: "Database",
    joinDate: new ISODate("2022-10-01"),
    salary: 400000,
    bonus: null
})


db.employees.insertOne({
    name: "ben",
    age: 23,
    dept: "Network",
    joinDate: new ISODate("2001-10-01"),
    salary: 1000000,
})

위와 같은 데이터가 있습니다. 보너스를 지급할 대상이 bonus 필드가 null 인 직원이라 해봅시다.

  • update query
db.employees.updateMany({
    resignationDate: {
        $exists: false
    },
    joinDate: {
        $exists: true
    },
    bonus: null
}, {
    $set: {
        bonus: 10000
    }
})

퇴사하지 않았고, bonus 필드가 null 인 유저의 bonus를 10000으로 지정합니다. 결과는요? bonus 필드가 존재하지 않는 경우도 null

  {
    _id: ObjectId("640730ba77ec14b4b106b6c4"),
    name: 'lake',
    age: 21,
    dept: 'Database',
    joinDate: ISODate("2022-10-01T00:00:00.000Z"),
    salary: 400000,
    bonus: 10000
  },
  {
    _id: ObjectId("640730ba77ec14b4b106b6c5"),
    name: 'ben',
    age: 23,
    dept: 'Network',
    joinDate: ISODate("2001-10-01T00:00:00.000Z"),
    salary: 1000000,
    bonus: 10000
  }
]
  • 두 Document 모두 업데이트가 됬습니다. 따라서 이런 경우는 꼭 다음과 같이 쿼리를 해야 합니다.
db.employees.updateMany({
    resignationDate: {
        $exists: false
    },
    joinDate: {
        $exists: true
    },
    bonus: {
        $exists: true
    }
}, {
    $set: {
        bonus: 10000
    }
})

or

db.employees.updateMany({
    $and: [
        { resignationDate: { $exists: false } },
        { joinDate: { $exists: true } },
        { bonus: { $exists: true } },
        { bonus: null } 
    ]
    }, 
    { $set: { bonus: 10000 } }
)
profile
배움을 즐기는 개발자입니다.

0개의 댓글