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

MongoDB에서 업데이트와 쿼리 부분을 결합해 Upsert 문서 구성하는 방법

MongoDB에서 업데이트와 쿼리를 결합하여 Upsert 문서 구성하기

MongoDB에서 upsert 기능을 활용하려면 $set 연산자와 함께 upsert: true 옵션을 사용해야 합니다. upsert는 업데이트(update)와 삽입(insert)의 합성어로, 조건에 일치하는 문서가 존재하면 해당 문서를 수정하고, 일치하는 문서가 없으면 새 문서를 자동으로 생성하는 동작을 의미합니다.

먼저 실습에 사용할 문서들을 담은 컬렉션을 생성해 보겠습니다.

> db.updateWithUpsertDemo.insertOne({"StudentFirstName":"John","StudentAge":21});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2a61c345990cee87fd890")
}
> db.updateWithUpsertDemo.insertOne({"StudentFirstName":"Larry","StudentAge":23});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2a624345990cee87fd891")
}
> db.updateWithUpsertDemo.insertOne({"StudentFirstName":"David","StudentAge":24});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2a62c345990cee87fd892")
}

컬렉션의 모든 문서 조회하기

다음은 find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 조회하는 쿼리입니다.

> db.updateWithUpsertDemo.find().pretty();

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5cd2a61c345990cee87fd890"),
   "StudentFirstName" : "John",
   "StudentAge" : 21
}
{
   "_id" : ObjectId("5cd2a624345990cee87fd891"),
   "StudentFirstName" : "Larry",
   "StudentAge" : 23
}
{
   "_id" : ObjectId("5cd2a62c345990cee87fd892"),
   "StudentFirstName" : "David",
   "StudentAge" : 24
}

업데이트와 쿼리를 결합한 Upsert 실행하기

이제 업데이트 부분과 쿼리 부분을 결합하여 upsert 문서를 구성하는 쿼리를 살펴보겠습니다. 아래 예제는 특정 _id를 가진 문서를 찾아 $set 연산자로 이름 필드를 변경하며, 일치하는 문서가 없을 경우 새 문서를 삽입하도록 upsert: true 옵션을 지정했습니다.

> db.updateWithUpsertDemo.update({_id: ObjectId("5cd2a624345990cee87fd891")},{"$set": {"StudentFirstName": "Chris"}}, {upsert:true});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

실행 결과에서 nMatched: 1, nModified: 1이 표시되었으므로, 조건에 일치하는 기존 문서가 성공적으로 수정되었음을 알 수 있습니다. 만약 일치하는 문서가 없었다면 nUpserted: 1이 출력되면서 새 문서가 생성됩니다.

변경 결과 확인하기

"StudentFirstName" 필드가 정상적으로 변경되었는지 다시 한번 전체 문서를 조회해 확인해 보겠습니다.

> db.updateWithUpsertDemo.find().pretty();

출력 결과는 다음과 같습니다.

{
   "_id" : ObjectId("5cd2a61c345990cee87fd890"),
   "StudentFirstName" : "John",
   "StudentAge" : 21
}
{
   "_id" : ObjectId("5cd2a624345990cee87fd891"),
   "StudentFirstName" : "Chris",
   "StudentAge" : 23
}
{
   "_id" : ObjectId("5cd2a62c345990cee87fd892"),
   "StudentFirstName" : "David",
   "StudentAge" : 24
}

위 결과를 보면 _id5cd2a624345990cee87fd891인 문서의 학생 이름이 "Larry"에서 "Chris"로 변경된 것을 확인할 수 있습니다. 이처럼 $set 연산자와 upsert: true 옵션을 함께 사용하면 기존 문서의 특정 필드만 안전하게 갱신하면서, 필요한 경우 새 문서까지 자동으로 생성할 수 있습니다.