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)
이 쿼리는 다음 문서를 반환합니다.