Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 필드가 없는 경우에만 삽입하는 방법

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에서 기존 데이터에 새로운 필드를 도입할 때 특히 유용합니다. 기본값으로 필드를 일괄 초기화하면서도 사용자가 이미 입력한 값은 보존할 수 있기 때문입니다.