정의
$replaceOneinput string에서 검색 string 또는 정규식 패턴 의 첫 번째 인스턴스 대체 string으로 바꿉니다.
일치하는 항목이 없으면 가 입력 문자열로
$replaceOne평가됩니다.$replaceOne대/소문자를 구분하고 발음 구별 부호를 구분하며 collection에 있는 모든 데이터 정렬을 무시합니다.
구문
$replaceOne 연산자 연산자 표현식 구문은 다음과 같습니다.
{ $replaceOne: { input: <expression>, find: <expression>, replacement: <expression> } }
연산자 필드
필드 | 설명 |
|---|---|
행동
입력에서 find가 발견되지 $replaceOne 않으면 이 입력 문자열로 평가됩니다.
입력, 찾기 및 대체 표현식은 다음 출력 유형 중 하나로 평가되어야 합니다.
문자열
null찾기 작업을 위한 정규식
그렇지 않으면 가 오류와 함께$replaceOne 실패합니다.
$replaceOne 및 Null 값
입력 또는 찾기가 누락된 필드 참조하는 경우 을 null 반환합니다.
입력, 찾기 또는 바꾸기 null 중 하나가 로 평가되면 전체 표현식 로 평가됩니다.$replaceOne null
예시 | 결과 |
|---|---|
|
|
|
|
|
|
$replaceOne 및 데이터 정렬
$replaceOne 표현식에 대한 문자열 일치는 항상 대소문자를 구분하고 발음 부호를 구분합니다. 과 문자열 비교를 수행할 때 구성된 모든 데이터 정렬은 무시됩니다. $replaceOne
예를 들어 데이터 정렬 강도가 1인 샘플 collection을 생성합니다.
db.createCollection( "restaurants", { collation: { locale: "fr", strength: 1 } } )
1의 데이터 정렬 강도는 기본 문자만 비교하고 대소문자 및 분음 부호와 같은 다른 차이점을 무시합니다.
다음으로 예시 문서를 삽입합니다.
db.restaurants.insertMany( [ { _id: 1, name: "cafe" }, { _id: 2, name: "Cafe" }, { _id: 3, name: "café" } ] )
다음 작업은 "Cafe"의 첫 번째 인스턴스 찾아 $replaceOne 바꾸려고 name 시도합니다. 필드 에 다음을 입력합니다.
db.restaurants.aggregate( [ { $addFields: { resultObject: { $replaceOne: { input: "$name", find: "Cafe", replacement: "CAFE" } } } } ] )
{ "_id" : 1, "name" : "cafe", "resultObject" : "cafe" } { "_id" : 2, "name" : "Cafe", "resultObject" : "CAFE" } { "_id" : 3, "name" : "café", "resultObject" : "café" }
$replaceOne는 이 컬렉션 에 대해 구성된 데이터 정렬을 무시하므로 이 작업 인스턴스 "Cafe" 문서 2 에서.
$match 와 같이 데이터 정렬을 존중하는 연산자는 이 컬렉션의 데이터 정렬 강도가 1이므로 "Cafe" 에 대해 문자열 비교를 수행할 때 세 문서 모두와 일치합니다.
$replaceOne 과 유니코드 정규화
$replaceOne 집계 표현식 유니코드 정규화를 수행하지 않습니다. 즉, 모든 표현식에 대한 $replaceOne 문자열 일치는 일치를 시도할 때 유니코드로 문자를 나타내는 데 사용되는 코드 점의 수를 고려합니다.
예를 들어 문자 é은(는) 한 개 또는 두 개의 코드 점을 사용하여 유니코드로 표현할 수 있습니다.
Unicode | 다음과 같이 표시됩니다. | 코드 포인트 |
|---|---|---|
|
| 1 ( |
|
| 2 ( |
문자 가 하나의 코드 점 있는 유니코드로 표시되는 찾기 문자열과 $replaceOne 함께 를 사용하면 é é 입력 문자열에 두 개의 코드 점을 사용하는 의 인스턴스 와 일치하지 않습니다.
다음 표는 "café"의 찾기 문자열에 대해 일치 항목이 발생하는지 여부를 é 보여줍니다. 가 하나 또는 두 개의 코드 점 로 표시되는 입력 문자열과 비교할 때 이 예시 의 찾기 문자열은 하나의 코드 점 사용하여 é 문자를 나타냅니다.
예시 | match |
|---|---|
| 네 |
| no |
는 $replaceOne 유니코드 정규화를 수행하지 않기 때문에 첫 번째 문자열 비교만 일치하며, 여기서 찾기 문자열과 입력 문자열은 모두 하나의 코드 점 사용하여 를 나타냅니다.é
예시
다음 문서로 inventory collection을 생성합니다.
db.inventory.insertMany( [ { _id: 1, item: "blue paint" }, { _id: 2, item: "blue and green paint" }, { _id: 3, item: "blue paint with blue paintbrush" }, { _id: 4, item: "blue paint with green paintbrush" }, ] )
문자열을 사용하여 바꾸기
다음 예시에서는 item 필드에 있는 "blue paint"의 첫 번째 인스턴스를 "red paint"로 바꿉니다.
db.inventory.aggregate([ { $project: { item: { $replaceOne: { input: "$item", find: "blue paint", replacement: "red paint" } } } } ])
이 연산은 다음과 같은 결과를 반환합니다.
{ _id: 1, item: "red paint" } { _id: 2, item: "blue and green paint" } { _id: 3, item: "red paint with blue paintbrush" } { _id: 4, item: "red paint with green paintbrush" }
문서 3에서는 "blue paint"의 첫 번째 일치 인스턴스만 대체됩니다.
정규식을 사용하여 바꾸기
다음 예시 item 필드 에서 전체 단어인 "blue"의 첫 번째 인스턴스 "navy"로 바꿉니다.
db.inventory.aggregate([ { $project: { item: { $replaceOne: { input: "$item", find: \\bblue\\b, replacement: "navy" } } } } ]);
이 연산은 다음과 같은 결과를 반환합니다.
{ _id: 1, item: "navy paint" } { _id: 2, item: "navy and green paint" } { _id: 3, item: "navy paint with blue paintbrush" } { _id: 4, item: "navy paint with green paintbrush" }
문서 3에서는 'blue'의 첫 번째 일치 인스턴스 만 대체됩니다.