이 섹션에서는 다양한 삽입 및 업데이트 작업에서 달러 기호($) 접두사가 붙은 필드 이름을 처리하다 방법을 요약하여 설명합니다. 일부 기능은 이러한 필드에서 지원되지 않으므로 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과(와) 같이 달러({8}) 접두사 필드가 있는 최상위를 업데이트합니다.
문서 수정 업데이트
업데이트가 기존 문서 필드를 대체하는 것이 아니라 수정하는 경우, 접두사가 달러 기호($)로 시작하는 필드가 최상위 필드 이름이 될 수 있습니다. 하위 필드에 직접 액세스할 수 있지만 최상위 필드에 액세스하려면 헬퍼 메서드가 필요합니다.
다음 재고 기록과 같은 문서가 포함된 컬렉션을 가정해 보겠습니다.
{ _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" } ] )