HOWTO · MongoDB

MongoDB의 업서트

Upsert는 업데이트 작업에 사용되는 옵션입니다. 부울 매개변수를 사용하고 쿼리와 일치하는 항목이 없으면 문서를 생성합니다. update, updateOne, replaceOne 및 findAndModify 메소드와 함께 사용할 수 있습니다.

이 페이지의 내용

MongoDB에서 upsertupdateinsert 명령을 결합합니다. update()findAndModify() 작업에서 사용할 수 있습니다.

MongoDB의 upsert 쿼리

upsert는 단일 부울 매개변수를 사용합니다. ‘TRUE’로 설정되고 쿼리 문서가 발견되면 문서를 업데이트합니다. 찾을 수 없으면 컬렉션에 새 문서를 삽입합니다.

통사론:

upsert: <boolean>

update() 메서드와 함께 upsert 쿼리 사용

직원에 대한 다음 문서가 있다고 가정합니다. 문서를 보려면 Mongosh 또는 MongoCLI에 다음 명령을 입력합니다(데이터베이스에 성공적으로 연결한 후).

> db.employee.find().pretty()
{"_id":1,   "name":"Alice"}
{"_id":2,   "name":"Bob"}

여기서 find()는 문서나 개체를 검색하는 데 사용됩니다. 매개변수를 전달할 수도 있습니다.

예를 들어 find({"_id":1})라고 쓰면 id가 1인 객체만 반환됩니다. pretty()는 멋진 형식으로 출력을 인쇄하기 위한 것입니다.

이제 다음과 같이 업데이트를 시도하면

> db.employee.update({_id:5},{name: "Jhon"})
WriteResult({"nMatched": 0,  "nUpserted": 0, "nModified": 0})

WriteResult에서 볼 수 있듯이 어떤 문서도 업데이트되지 않았습니다. 이제 TRUE 값으로 upsert 옵션을 시도하십시오.

이름을 검색하고 업데이트한다고 가정해 보겠습니다. 예를 들어 upsert 옵션을 사용하여 모든 이름 SamSamuel로 업데이트하려고 합니다.

쿼리는 다음과 같을 것입니다.

> db.employee.update({name:"Sam"},{name: "Samuel"})
WriteResult({
    "nMatched": 0,  
    "nUpserted": 1, 
    "nModified": 0,
    "_id": ObjectId("67874504aed8aee9986")
})
>

여기에서 upserted 값이 1임을 알 수 있습니다. Sam이라는 이름과 일치하는 항목이 없기 때문에 고유한 _id를 사용하여 엔터티를 생성했습니다.

이제 직원 아래의 모든 엔터티를 보려면 다음 쿼리를 실행할 수 있습니다.

> db.employee.find().pretty()
{"_id":1,   "name":"Alice"}
{"_id":2,   "name":"Bob"}
{"_id":ObjectId("67874504aed8aee9986"),   "name":"Samuel"}
>

upsert 쿼리를 findAndModify() 메서드와 함께 사용

이 메서드는 update() 메서드와 동일하게 작동하지만 findAndModify는 첫 번째로 일치하는 개체만 업데이트하는 반면 update는 일치하는 모든 엔터티를 수정합니다.

id가 3인 새 필드를 추가한다고 가정합니다. 우리는 다음을 쓸 것입니다:

db.employee.findAndModify({query: {_id:3}, update:{$inc: {salary: 1500}}, upsert: true})
null
>

존재하지 않았기 때문에 null을 반환합니다.

모든 엔터티를 보면 upsertTRUE로 설정되어 새 개체가 문서에 추가된 것을 볼 수 있습니다. id가 3이고 급여가 1500인 새 엔터티를 추가했습니다.

> db.employee.find().pretty()
{"_id":1,   "name":"Alice"}
{"_id":2,   "name":"Bob"}
{"_id":ObjectId("67874504aed8aee9986"),   "name":"Samuel"}
{"_id":5,   "salary":"1500"}

upsert를 지원하는 다른 방법

다음 방법에서도 upsert 옵션을 사용할 수 있습니다.

  1. 업데이트원()
  2. replaceOne()

자세한 내용은 이 블로그를 참조하십시오. 또한 여기 MongoDB의 공식 문서가 있습니다.