MongoDB에서 필드가 없는 경우에만 삽입하는 방법
MongoDB에서 특정 필드가 존재하지 않는 문서에만 새로운 필드를 추가하고 싶은 경우가 자주 있습니다. 이때 $exists 연산자와 update() 메서드를 조합하면 이미 해당 필드를 가진 문서는 그대로 두고, 필드가 없는 문서에만 값을 안전하게 삽입할 수 있습니다.
실제 동작 과정을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성 및 문서 삽입
먼저 테스트용 컬렉션을 만들고 세 개의 문서를 삽입합니다. 마지막 문서만 StudentAge 필드를 가지고 있다는 점에 주목하세요.
> db.missingDocumentDemo.insertOne({"StudentFirstName":"Adam","StudentLastName":"Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3fb1eedc6604c74817ce6")
}
> db.missingDocumentDemo.insertOne({"StudentFirstName":"Carol","StudentLastName":"Taylor"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3fb29edc6604c74817ce7")
}
> db.missingDocumentDemo.insertOne({"StudentFirstName":"David","StudentLastName":"Miller","StudentAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3fb40edc6604c74817ce8")
}2단계: 전체 문서 확인
find() 메서드를 사용해 컬렉션에 저장된 모든 문서를 조회해 보겠습니다.
> db.missingDocumentDemo.find().pretty();
위 쿼리는 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5cd3fb1eedc6604c74817ce6"),
"StudentFirstName" : "Adam",
"StudentLastName" : "Smith"
}
{
"_id" : ObjectId("5cd3fb29edc6604c74817ce7"),
"StudentFirstName" : "Carol",
"StudentLastName" : "Taylor"
}
{
"_id" : ObjectId("5cd3fb40edc6604c74817ce8"),
"StudentFirstName" : "David",
"StudentLastName" : "Miller",
"StudentAge" : 21
}3단계: 필드가 없는 문서에만 업데이트 실행
이제 핵심 부분입니다. 조건문에서 { "StudentAge": { "$exists": false } }를 사용하면 StudentAge 필드가 없는 문서만 매칭됩니다. 여기에 $set으로 값을 지정하고, multi: true 옵션을 추가해 일치하는 모든 문서에 적용합니다.
> db.missingDocumentDemo.update(
... { "StudentAge": { "$exists": false } },
... { "$set": { "StudentAge": 23 } },
... { "multi": true }
... );
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })실행 결과를 보면 nMatched: 2, nModified: 2로 나타납니다. 즉, StudentAge 필드가 없던 두 개의 문서(Adam, Carol)만 수정되었고, 이미 나이 값이 있던 David의 문서는 변경되지 않았습니다.
4단계: 최종 결과 확인
다시 전체 문서를 조회해 변경 사항을 확인해 보겠습니다.
> db.missingDocumentDemo.find().pretty();
결과는 다음과 같습니다.
{
"_id" : ObjectId("5cd3fb1eedc6604c74817ce6"),
"StudentFirstName" : "Adam",
"StudentLastName" : "Smith",
"StudentAge" : 23
}
{
"_id" : ObjectId("5cd3fb29edc6604c74817ce7"),
"StudentFirstName" : "Carol",
"StudentLastName" : "Taylor",
"StudentAge" : 23
}
{
"_id" : ObjectId("5cd3fb40edc6604c74817ce8"),
"StudentFirstName" : "David",
"StudentLastName" : "Miller",
"StudentAge" : 21
}정리 및 핵심 포인트
$exists: false조건을 사용하면 특정 필드가 없는 문서만 선택할 수 있습니다.$set연산자로 새 필드와 기본값을 한 번에 지정할 수 있습니다.multi: true옵션을 생략하면 첫 번째로 매칭된 문서 하나만 수정되므로, 여러 문서를 대상으로 할 때는 반드시 설정해야 합니다.- 이미 필드가 존재하는 문서는 기존 값을 유지하므로, 데이터 덮어쓰기 걱정 없이 안전하게 초기값을 채울 수 있습니다.
이 패턴은 스키마가 유연한 MongoDB에서 기존 데이터에 새로운 필드를 도입할 때 특히 유용합니다. 기본값으로 필드를 일괄 초기화하면서도 사용자가 이미 입력한 값은 보존할 수 있기 때문입니다.