MongoDB 컬렉션의 모든 문서에 새 필드 추가

Tahseen Tauseef 2024년2월15일
  1. MongoDB의 $set 연산자
  2. MongoDB의 $setOnInsert 연산자
  3. MongoDB 컬렉션의 문서에 새 필드 추가
MongoDB 컬렉션의 모든 문서에 새 필드 추가

이 문서에서는 $set$setOnInsert 작업에 대해 설명합니다. 또한 MongoDB에서 컬렉션에 필드를 추가하는 문제도 이 두 연산자를 사용하여 간략하게 설명합니다.

MongoDB의 $set 연산자

$set 연산자는 필드 값을 제공된 값으로 변경합니다. $set 연산자 표현식은 다음과 같습니다. { $set: { <field1>: <value1>, ... } }.

포함된 텍스트 또는 배열에서 <field>를 정의하려면 점 표기법을 사용하십시오.

$set 연산자의 동작

업데이트 연산자는 MongoDB 5.0부터 사전식 순서로 문자열 기반 이름이 있는 문서 필드를 처리합니다. 숫자 이름 필드는 숫자 순서대로 처리됩니다.

필드가 아직 존재하지 않는 경우 $set은 새 필드가 유형 제한을 위반하지 않는 한 요청된 값으로 필드를 생성합니다. 존재하지 않는 필드에 대해 점선 경로를 지정하면 $set은 점선 경로를 완성하는 데 필요에 따라 포함된 문서를 구성합니다.

$set은 여러 필드-값 쌍을 제공하는 경우 각 필드를 업데이트하거나 생성합니다.

MongoDB 5.0에서 빈 피연산자 표현식({})과 함께 $set과 같은 업데이트 연산자를 사용할 때 mongod에서 더 이상 오류가 발생하지 않습니다. 빈 업데이트로 인한 수정 사항이 없으며 oplog 레코드가 생성되지 않습니다(작업이 no-op임을 의미함).

예를 들어 컬렉션을 생성해 보겠습니다.

db.clothes.insertOne(
   {
     _id: 100,
     quantity: 250,
     instock: true,
     reorder: false,
     details: { model: "14RR", make: "Clothes" },
     tags: [ "apparel", "clothing" ],
     ratings: [ { by: "Customer127", rating: 5 } ]
   }
)

최상위 필드 설정

다음 절차에서는 $set 연산자를 사용하여 quantity, detailstags 필드의 값을 변경하여 _id 기준을 100과 일치하는 문서에 대해 설명합니다.

db.clothes.updateOne(
   { _id: 100 },
   { $set:
      {
        quantity: 400,
        details: { model: "2600", make: "Fashionables" },
        tags: [ "coats", "outerwear", "clothing" ]
      }
   }
)

이 작업은 다음을 업데이트합니다.

  1. 수량에서 400까지의 값.
  2. 새 내장 문서가 포함된 세부 사항 필드.
  3. 새 배열이 포함된 tags 필드.

이제 문서의 값은 다음과 같습니다.

{
  _id: 100,
  quantity: 400,
  instock: true,
  reorder: false,
  details: { model: '2600', make: 'Fashionables' },
  tags: [ 'coats', 'outerwear', 'clothing' ],
  ratings: [ { by: 'Customer127', rating: 5 } ]
}

포함된 문서의 필드 설정

점 표기법을 사용하여 포함된 텍스트 또는 배열에서 <필드>를 나타냅니다. 다음 작업은 100과 같은 기준 _id를 충족하는 문서에 대한 details 문서의 make 필드를 수정합니다.

db.clothes.updateOne(
   { _id: 100 },
   { $set: { "details.make": "Kidz" } }
)

업데이트 후 문서의 값은 이제 다음과 같습니다.

포함된 문서의 필드 설정 - 출력

배열의 요소 설정

점 표기법을 사용하여 포함된 텍스트 또는 배열에서 <필드>를 나타냅니다.

다음 조치는 tags 필드의 두 번째 요소 값과 ratings 배열의 첫 번째 요소에 있는 ratings 필드를 100과 같은 조건 _id를 충족하는 문서에 대해 수정합니다.

db.clothes.updateOne(
   { _id: 100 },
   { $set:
      {
        "tags.1": "rain wear",
        "ratings.0.rating": 3
      }
   }
)

업데이트 후 문서의 값은 이제 다음과 같습니다.

배열의 요소 설정 - 출력

MongoDB의 $setOnInsert 연산자

upsert: true를 사용한 업데이트 작업으로 인해 문서가 삽입된 경우 $setOnInsert는 제공된 값을 문서의 필드에 적용합니다. $setOnInsert는 업데이트 작업이 삽입되지 않으면 아무 작업도 수행하지 않습니다.

upsert 옵션을 지정할 수 있습니다.

$setOnInsert 연산자의 동작

업데이트 연산자는 MongoDB 5.0부터 사전식 순서로 문자열 기반 이름이 있는 문서 필드를 처리합니다. 숫자 이름 필드는 숫자 순서대로 처리됩니다.

MongoDB 5.0에서 빈 피연산자 표현식({})과 함께 $setOnInsert와 같은 업데이트 연산자를 사용할 때 mongod에서 더 이상 오류가 발생하지 않습니다. 빈 업데이트로 인한 수정 사항이 없으며 oplog 레코드가 생성되지 않습니다(작업이 no-op임을 의미함).

예를 들어 컬렉션에는 문서가 없습니다. upsert: true 매개변수와 함께 db.collection.updateOne()을 사용하여 새 문서를 삽입합니다.

db.clothes.updateOne(
  { _id: 1 },
  {
     $set: { item: "banana" },
     $setOnInsert: { defaultQty: 100 }
  },
  { upsert: true }
)

<query>는 MongoDB에서 _id: 1 식별자로 새 문서를 생성하는 데 사용됩니다. $setOnInsert는 요청된 문서를 변경합니다.

새로 삽입된 문서는 컬렉션에서 찾을 수 있습니다.

{ "_id" : 1, "item" : "banana", "defaultQty" : 100 }

upsert 매개변수가 true인 경우 db.collection.updateOne() 메소드:

  1. 새 문서를 만들고,
  2. $set 작업을 적용합니다.
  3. $setOnInsert 작업을 적용합니다.

db.collection.updateOne()이 기존 문서와 일치하는 경우 MongoDB는 $set 작업만 적용합니다.

MongoDB 컬렉션의 문서에 새 필드 추가

다음 방법을 사용하여 MongoDB의 컬렉션에 있는 모든 문서에 새 필드를 추가할 수 있습니다.

다음 문서와 함께 수집 팀과 함께 각 방법을 사용하는 예도 나와 있습니다.

db.teams.insertOne({team: "United", position: "Defence", points: 31})
db.teams.insertOne({team: "Spurs", position: "Defence", points: 22})
db.teams.insertOne({team: "Palace", position: "Center", points: 19})
db.teams.insertOne({team: "Eagles", position: "Forward", points: 26})
db.teams.insertOne({team: "Lions", position: "Defence", points: 33})

값 없이 새 필드 추가

통사론:

db.collection.updateMany({}, {$set:{"new_field": null}})

다음 코드를 사용하여 null 값이 있는 rebounds라는 새 필드를 컬렉션의 모든 기존 문서에 추가할 수 있습니다.

db.teams.updateMany({}, {$set:{"rebounds": null}})

다음 쿼리를 작성하여 처음 몇 개의 업데이트된 문서를 볼 수 있습니다.

db.teams.find().limit(3)

이 쿼리는 다음 문서를 반환합니다.

값 없이 새 필드 추가 - 출력

특정 값으로 새 필드 추가

통사론:

db.collection.updateMany({}, {$set:{"new_field": 10}})

다음 코드를 사용하여 값이 10rebounds라는 새 필드를 컬렉션의 모든 기존 문서에 추가할 수 있습니다.

db.teams.updateMany({}, {$set:{"rebounds": 10}})

다음 쿼리를 작성하여 처음 몇 개의 업데이트된 문서를 볼 수 있습니다.

db.teams.find().limit(3)

이 쿼리는 다음 문서를 반환합니다.

특정 값이 있는 새 필드 추가 - 출력

기존 필드의 값을 사용하여 새 필드 추가

통사론:

db.collection.updateMany(
    {},
    [
        {"$set": {"name": { "$concat": ["$field1", " ", "$field2"]}}}
    ]
)

다음 코드를 사용하여 기존 필드 teamposition의 연결 값인 name이라는 필드를 추가할 수 있습니다.

db.teams.updateMany(
    {},
    [
        {"$set": {"name": { "$concat": ["$team", " ", "$position"]}}}
    ]
)

다음 쿼리를 작성하여 처음 몇 개의 업데이트된 문서를 볼 수 있습니다.

db.teams.find().limit(3)

이 쿼리는 다음 문서를 반환합니다.

기존 필드의 값을 사용하여 새 필드 추가 - 출력

관련 문장 - MongoDB Collection