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, details 및 tags 필드의 값을 변경하여 _id 기준을 100과 일치하는 문서에 대해 설명합니다.
db.clothes.updateOne(
{ _id: 100 },
{ $set:
{
quantity: 400,
details: { model: "2600", make: "Fashionables" },
tags: [ "coats", "outerwear", "clothing" ]
}
}
)
이 작업은 다음을 업데이트합니다.
수량에서400까지의 값.- 새 내장 문서가 포함된
세부 사항필드. - 새 배열이 포함된
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() 메소드:
- 새 문서를 만들고,
$set작업을 적용합니다.$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}})
다음 코드를 사용하여 값이 10인 rebounds라는 새 필드를 컬렉션의 모든 기존 문서에 추가할 수 있습니다.
db.teams.updateMany({}, {$set:{"rebounds": 10}})
다음 쿼리를 작성하여 처음 몇 개의 업데이트된 문서를 볼 수 있습니다.
db.teams.find().limit(3)
이 쿼리는 다음 문서를 반환합니다.

기존 필드의 값을 사용하여 새 필드 추가
통사론:
db.collection.updateMany(
{},
[
{"$set": {"name": { "$concat": ["$field1", " ", "$field2"]}}}
]
)
다음 코드를 사용하여 기존 필드 team 및 position의 연결 값인 name이라는 필드를 추가할 수 있습니다.
db.teams.updateMany(
{},
[
{"$set": {"name": { "$concat": ["$team", " ", "$position"]}}}
]
)
다음 쿼리를 작성하여 처음 몇 개의 업데이트된 문서를 볼 수 있습니다.
db.teams.find().limit(3)
이 쿼리는 다음 문서를 반환합니다.
