MongoDB의 업서트
-
MongoDB의
upsert
쿼리 -
update()
메서드와 함께upsert
쿼리 사용 -
upsert
쿼리를findAndModify()
메서드와 함께 사용 -
upsert
를 지원하는 다른 방법
MongoDB에서 upsert
는 update
및 insert
명령을 결합합니다. 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
옵션을 사용하여 모든 이름 Sam
을 Samuel
로 업데이트하려고 합니다.
쿼리는 다음과 같을 것입니다.
> 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
을 반환합니다.
모든 엔터티를 보면 upsert
가 TRUE
로 설정되어 새 개체가 문서에 추가된 것을 볼 수 있습니다. 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
옵션을 사용할 수 있습니다.
업데이트원()
replaceOne()