MongoDB에서 존재하지 않는 경우에만 레코드 삽입하기
MongoDB에서는 update() 함수를 사용하여 해당 레코드가 존재하지 않을 때만 새로운 레코드를 삽입할 수 있습니다. 핵심은 upsert 옵션입니다. upsert를 true로 설정하면 조건에 일치하는 문서가 없을 때 MongoDB가 자동으로 새 문서를 생성하고, 일치하는 문서가 있으면 기존 문서를 업데이트합니다.
개념을 이해하기 위해 먼저 샘플 컬렉션과 문서를 만들어 보겠습니다.
1단계: 샘플 컬렉션 생성
> db.insertIfNotExistsDemo.insertOne({"StudentName":"Mike","StudentAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7eec7b559dd2396bcfbfc2")
}
> db.insertIfNotExistsDemo.insertOne({"StudentName":"Sam","StudentAge":22});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7eec97559dd2396bcfbfc3")
}2단계: find() 메서드로 전체 문서 확인
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.insertIfNotExistsDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c7eec7b559dd2396bcfbfc2"),
"StudentName" : "Mike",
"StudentAge" : 21
}
{
"_id" : ObjectId("5c7eec97559dd2396bcfbfc3"),
"StudentName" : "Sam",
"StudentAge" : 22
}3단계: upsert 옵션으로 조건부 삽입 실행
이제 레코드가 이미 존재하지 않는 경우에만 삽입되도록 하는 쿼리를 살펴보겠습니다. 검색 조건(key)과 삽입할 값(value)을 각각 변수로 정의한 후, update() 함수에 upsert=true 옵션을 지정합니다.
> key = {"StudentName":"David"}
{ "StudentName" : "David" }
> value = {"StudentName":"David","StudentAge":26}
{ "StudentName" : "David", "StudentAge" : 26 }
> db.insertIfNotExistsDemo.update(key, value, upsert=true);실행 결과는 다음과 같습니다.
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5c7eecd4c743760e97af8261")
})결과를 해석해 보면 nMatched : 0은 조건에 일치하는 기존 문서가 없었다는 의미이고, nUpserted : 1은 새 문서 하나가 삽입되었음을 나타냅니다.
4단계: 최종 결과 확인
컬렉션의 모든 문서를 다시 조회해 보겠습니다.
> db.insertIfNotExistsDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c7eec7b559dd2396bcfbfc2"),
"StudentName" : "Mike",
"StudentAge" : 21
}
{
"_id" : ObjectId("5c7eec97559dd2396bcfbfc3"),
"StudentName" : "Sam",
"StudentAge" : 22
}
{
"_id" : ObjectId("5c7eecd4c743760e97af8261"),
"StudentName" : "David",
"StudentAge" : 26
}위 출력 결과에서 볼 수 있듯이 "StudentName": "David", "StudentAge": 26인 새 문서가 성공적으로 삽입된 것을 확인할 수 있습니다.
참고 사항
참고로 최신 MongoDB 버전(4.2 이상)에서는 update() 대신 updateOne() 또는 updateMany() 메서드 사용이 권장됩니다. 예를 들어 위 작업은 다음과 같이 작성할 수 있습니다.
> db.insertIfNotExistsDemo.updateOne(
... { "StudentName": "David" },
... { $set: { "StudentName": "David", "StudentAge": 26 } },
... { upsert: true }
... );upsert 옵션을 활용하면 중복 데이터를 방지하면서 필요한 경우에만 새 레코드를 안전하게 추가할 수 있어 실무에서 매우 유용하게 활용됩니다.