MongoDB의 업서트

Shihab Sikder 2023년6월20일
  1. MongoDB의 upsert 쿼리
  2. update() 메서드와 함께 upsert 쿼리 사용
  3. upsert 쿼리를 findAndModify() 메서드와 함께 사용
  4. upsert를 지원하는 다른 방법
MongoDB의 업서트

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의 공식 문서가 있습니다.

Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website