Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

모두 교체 (집계)

이 페이지의 내용

  • 정의
  • 구문
  • 행동
  • 예시
$replaceAll

입력 문자열에 있는 검색 문자열의 모든 인스턴스를 대체 문자열로 바꿉니다.

$replaceAll 대/소문자를 구분하고 발음 구별 부호를 구분하며 collection에 있는 모든 데이터 정렬을 무시합니다.

$replaceAll 연산자는 다음과 같은 연산자 표현식 구문이 있습니다.

{ $replaceAll: { input: <expression>, find: <expression>, replacement: <expression> } }
필드
설명

find를 적용할 문자열입니다. 문자열 또는 null로 해석되는 모든 유효한 표현식 일 수 있습니다. input이 누락된 필드를 참조하는 경우 $replaceAllnull을 반환합니다.

주어진 input 내에서 검색할 문자열입니다. 문자열 또는 null로 해석되는 모든 유효한 표현식 일 수 있습니다. find가 누락된 필드를 참조하는 경우 $replaceAllnull을 반환합니다.

input에서 일치하는 모든 find 인스턴스를 바꾸는 데 사용할 문자열입니다. 문자열 또는 null로 해석되는 모든 유효한 표현식일 수 있습니다.

input, findreplacement 표현식은 문자열 또는 null로 평가되어야 하며, 그렇지 않으면 $replaceAll이 오류가 발생하여 실패합니다.

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

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 표현식에 대한 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" }

돌아가기

$replaceOne

이 페이지의 내용