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