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

MongoDB에서 동일한 업데이트에 $addToSet 여러 번 사용하는 방법

네, 가능합니다. MongoDB에서는 update() 메서드를 사용하면 동일한 업데이트 작업 안에서 $addToSet 연산자를 여러 번 활용할 수 있습니다. $addToSet은 배열에 값을 추가하되, 이미 존재하는 값은 중복해서 넣지 않는 연산자로, 중복 없는 배열을 유지할 때 매우 유용합니다.

1. 컬렉션 생성 및 문서 삽입

먼저 문서가 담긴 컬렉션을 생성해 보겠습니다.

> db.demo27.insertOne({"StudentDetails":{"101":{"Subject":["Java"]}}});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e15f9e822d07d3b95082e7f")
}
> db.demo27.insertOne({"StudentDetails":{"101":{"Subject":["MySQL"]}}});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e15f9eb22d07d3b95082e80")
}

2. 삽입된 문서 확인

find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.

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

위 명령은 다음과 같은 결과를 출력합니다.

{
   "_id" : ObjectId("5e15f9e822d07d3b95082e7f"),
   "StudentDetails" : {
      "101" : {
         "Subject" : [
            "Java"
         ]
      }
   }
}
{
   "_id" : ObjectId("5e15f9eb22d07d3b95082e80"),
   "StudentDetails" : {
      "101" : {
         "Subject" : [
            "MySQL"
         ]
      }
   }
}

3. $addToSet으로 배열 값 추가하기

다음은 $addToSet을 사용해 StudentDetails.101.Subject 배열에 "MongoDB"를 추가하는 쿼리입니다.

> db.demo27.update({}, {$addToSet: {"StudentDetails.101.Subject": "MongoDB"}}, {upsert: true})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

실행 결과에서 nMatched가 1로 표시된 것은 조건에 일치한 한 개의 문서가 실제로 수정되었음을 의미합니다.

4. 업데이트 결과 확인

다시 find() 메서드로 전체 문서를 조회해 보겠습니다.

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

결과는 다음과 같습니다.

{
   "_id" : ObjectId("5e15f9e822d07d3b95082e7f"),
   "StudentDetails" : {
      "101" : {
         "Subject" : [
            "Java",
            "MongoDB"
         ]
      }
   }
}
{
   "_id" : ObjectId("5e15f9eb22d07d3b95082e80"),
   "StudentDetails" : {
      "101" : {
         "Subject" : [
            "MySQL"
         ]
      }
   }
}

첫 번째 문서의 Subject 배열에 "MongoDB"가 정상적으로 추가된 것을 확인할 수 있습니다. 두 번째 문서는 업데이트 조건에 해당하지 않아 원본 그대로 유지됩니다.

5. 하나의 업데이트에서 $addToSet 여러 번 활용하기

하나의 update() 호출 안에서 서로 다른 필드에 대해 $addToSet을 동시에 적용할 수도 있습니다. $addToSet 객체 안에 여러 필드-값 쌍을 나열하면 됩니다.

> db.demo27.update(
...    {},
...    {
...       $addToSet: {
...          "StudentDetails.101.Subject": "MongoDB",
...          "StudentDetails.102.Subject": "Python"
...       }
...    },
...    {upsert: true}
... )

이처럼 단 한 번의 업데이트로 여러 배열에 동시에 값을 추가할 수 있습니다. 또한 upsert 옵션이 true로 설정되어 있기 때문에, 조건에 일치하는 문서가 없을 경우 새 문서가 자동으로 생성됩니다. 참고로 MongoDB에서는 하나의 업데이트 문서 내에 동일한 연산자를 중복 선언할 수 없으므로, 여러 필드에 $addToSet을 적용하려면 위 예제처럼 하나의 $addToSet 안에 필드들을 묶어 작성하는 것이 올바른 방식입니다.