이 섹션에서는 다양한 삽입 및 업데이트 작업에서 달러 기호($
) 접두사가 붙은 필드 이름을 처리하다 방법을 요약하여 설명합니다. 일부 기능은 이러한 필드에서 지원되지 않으므로 MongoDB 달러 접두사가 붙은 필드 이름의 사용을 권장하지 않습니다. 자세한 내용은 일반 제한 사항을 참조하세요.
삽입 작업
달러 기호($
) 접두사가 붙은 필드는 삽입 시 최상위 및 중첩 필드 이름으로 허용됩니다.
db.sales.insertOne( { "$price": 50.00, "quantity": 30 } )
예약어를 사용하는 삽입에는 달러($
) 접두사가 붙은 필드가 허용됩니다. $inc
같은 연산자 이름과 id
, db
, ref
같은 단어도 필드 이름으로 사용할 수 있습니다.
db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true } } )
업서트 중에 새 문서를 생성하는 업데이트는 필드 이름 유효성 검사에서 update
가 아닌 insert
로 처리됩니다. 업서트는 달러 기호($
) 접두사가 붙은 필드를 사용할 수 있습니다. 그러나 업서트는 특수한 경우이므로 업데이트의 match
부분에서 기존 문서를 선택하면 유사한 업데이트 작업으로 인해 오류가 발생할 수 있습니다.
이 코드 샘플에는 upsert: true
가 있으므로, 컬렉션에 쿼리 텀 { "date": "2021-07-07" }
와 일치하는 문서가 아직 포함되어 있지 않은 경우 새 문서를 삽입합니다. 이 샘플 코드가 기존 문서와 일치하는 경우, $hotel
에 달러($
) 접두사가 있으므로 업데이트가 실패합니다.
db.expenses.updateOne( { "date": "2021-07-07" }, { $set: { "phone": 25.17, "$hotel": 320.10 } }, { upsert: true } )
문서 교체 업데이트
업데이트 연산자는 기존 필드를 새 문서로 바꾸거나 해당 필드를 수정합니다. 업데이트가 대체를 수행하는 경우, 달러($
) 접두사가 붙은 필드는 최상위 필드 이름으로 허용되지 않습니다.
다음과 같은 문서를 예로 들어 보겠습니다.
{ "_id": "E123", "address": { "$number": 123, "$street": "Elm Road" }, "$rooms": { "br": 2, "bath": 1 } }
기존 문서를 대체하는 업데이트 연산자를 사용하여 address.$street
필드를 수정할 수 있지만 $rooms
필드는 이러한 방식으로 업데이트할 수 없습니다.
db.housing.updateOne( { "_id": "E123" }, { $set: { "address.$street": "Elm Ave" } } )
집계 파이프라인의 일부로 $setField
를 사용하여 $rooms
와 같은최상위 달러($
) 접두사가 붙은 필드를 업데이트합니다.
문서 수정 업데이트
업데이트가 기존 문서 필드를 대체하는 것이 아니라 수정하는 경우, 접두사가 달러 기호($
)로 시작하는 필드가 최상위 필드 이름이 될 수 있습니다. 하위 필드에 직접 액세스할 수 있지만 최상위 필드에 액세스하려면 헬퍼 메서드가 필요합니다.
다음 재고 기록과 같은 문서가 포함된 컬렉션을 가정해 보겠습니다.
{ _id: ObjectId("610023ad7d58ecda39b8d161"), "part": "AB305", "$bin": 200, "quantity": 100, "pricing": { sale: true, "$discount": 60 } }
pricing.$discount
하위 필드를 직접 쿼리할 수 있습니다.
db.inventory.findAndModify( { query: { "part": { $eq: "AB305" } }, update: { $inc: { "pricing.$discount": 10 } } } )
$getField
및 $literal
을 사용하여 최상위 수준 $bin
필드의 값에 액세스합니다.
db.inventory.findAndModify( { query: { $expr: { $eq: [ { $getField: { $literal: "$bin" } }, 200 ] } }, update: { $inc: { "quantity": 10 } } } )
집계 파이프라인으로 업데이트하기
집계 파이프라인에서 미리 설정된 달러 필드($
)를 수정하려면 $replaceWith
단계에서 $setField
, $getField
및 $literal
등을 사용합니다.
다음과 같은 학교 성적표 컬렉션을 고려해보세요.
db.school.insertOne ( { "_id": 100001, "$term": "fall", "registered": true, "grade": 4 } )
파이프라인을 사용하여 봄 학기에 대한 새 컬렉션을 만들고 달러 기호($
) 접두사가 붙은 $term
필드를 업데이트합니다.
db.school.aggregate( [ { $match: { "registered": true } }, { $replaceWith: { $setField: { field: { $literal: "$term" }, input: "$$ROOT", value: "spring" } } }, { $out: "spring2022" } ] )