문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

마침표(.) 및 달러 기호($)가 있는 필드 이름

이 페이지의 내용

  • 개요
  • 삽입 작업
  • 문서 교체 업데이트
  • 문서 수정 업데이트
  • aggregation pipeline으로 업데이트하기
  • 일반 제한 사항

MongoDB 5.0에는 달러 기호($) 접두사가 있거나 마침표(.)가 포함된 필드 이름에 대한 향상된 지원이 추가되었습니다. 이러한 문자를 사용하는 데이터 소스로 더 쉽게 작업할 수 있도록 데이터 저장에 대한 유효성 검사 규칙이 업데이트되었습니다.

대부분의 경우 이와 같은 필드 이름을 사용하여 저장된 데이터는 직접 액세스할 수 없습니다. 해당 필드에 액세스하는 쿼리에서 $getField, $setField, $literal 등과 같은 헬퍼 메서드를 사용해야 합니다.

필드 이름 유효성 검사 규칙은 모든 유형의 스토리지 작업에 대해 동일하지 않습니다. 이 페이지에서는 다양한 삽입 및 업데이트 작업에서 달러 기호($) 접두사가 붙은 필드 이름을 처리하는 방법을 요약하여 설명합니다.

달러 기호($) 접두사가 붙은 필드는 삽입 시 최상위 및 중첩 필드 이름으로 허용됩니다.

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 등을 사용합니다.

다음과 같은 학교 성적표 컬렉션을 고려해보세요.

{
"_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" }
] )

위의 스토리지 유효성 검사 규칙 외에도 달러($) 접두사가 붙은 필드 이름을 사용하는 데에는 몇 가지 일반적인 제한 사항이 있습니다. 이러한 필드는 다음을 수행할 수 없습니다.

  • 인덱스 생성

  • 샤드 키의 일부로 사용

  • (으)로 유효성을 검사 $jsonSchema

  • 이스케이프 시퀀스로 수정

  • 필드 레벨 암호화와 함께 사용

  • _id 문서에서 하위 필드로 사용

경고

달러 기호($) 및 마침표(.)로 인한 데이터 손실 가능성

달러($) 접두사가 붙은 필드 이름 또는 마침표(.)가 포함된 필드 이름을 사용할 때 MongoDB 5.0 이전 서버에서 이러한 필드 이름이 승인되지 않은 쓰기(쓰기 고려 w=0)와 함께 사용되는 경우 데이터가 손실될 가능성이 적습니다.

insert, updatefindAndModify 명령을 실행할 때 5.0과 호환되는 드라이버는 필드 이름 앞에 달러 기호($)가 붙거나 마침표(.)가 포함된 문서의 사용 제한을 제거합니다. 이러한 필드 이름은 이전 드라이버 버전에서 클라이언트 사이드 오류를 발생시켰습니다.

드라이버가 연결된 서버 버전에 관계없이 제한이 제거됩니다. 5.0 드라이버가 이전 서버로 문서를 보내는 경우 오류를 보내지 않고 문서가 거부됩니다.

경고

달러 기호($) 및 마침표(.)를 사용한 가져오기 및 내보내기 관련 문제

MongoDB 5 부터 시작.0, 문서 필드 이름 앞에 달러($)를 붙일 수 있으며 마침표(.)를 포함할 수 있습니다. 그러나 mongoimportmongoexport 는 이러한 문자를 사용하는 필드 이름이 있는 일부 상황에서 예상대로 작동하지 않을 수 있습니다.

MongoDB 확장 JSON v2는 유형 래퍼와 유형 래퍼와 이름이 같은 필드를 구분할 수 없습니다. 해당 BSON 표현에 달러($) 접두사가 붙은 키가 포함될 수 있는 상황에서는 확장 JSON 형식을 사용하지 않도록 합니다. DBRef 메커니즘에는 해당 일반 규칙이 적용되지 않습니다.

필드 이름에 마침표(.)와 함께 mongoimportmongoexport 를 사용하는 것도 제한됩니다. CSV 파일은 마침표(.)를 사용하여 데이터 계층 구조를 나타내므로 필드 이름에 마침표(.)가 있으면 중첩 수준으로 잘못 해석됩니다.

← 분산된 쿼리