$replaceAll(集計)
定義
$replaceAll
入力文字列内の検索文字列のすべてのインスタンスを置換文字列で置き換えます。
$replaceAll
は大文字と小文字、および発音区別符号を区別し、コレクションに存在する照合を無視します。
構文
$replaceAll
演算子には次の演算子式の構文があります。
{ $replaceAll: { input: <expression>, find: <expression>, replacement: <expression> } }
演算子フィールド
フィールド | 説明 |
---|---|
動作
input 、 find 、および置換式は、string またはnull
に評価される必要があります。または$replaceAll
はエラーで失敗します。
$replaceAll
および NULL 値
inputまたはfindが欠落しているフィールドを参照する場合、 null
が返されます。
input 、 find 、または 置換 の いずれか が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
と 照合
すべての$replaceAll
式に対する string マッチングでは、常に大文字と小文字が区別され、発音区別符号が区別されます。 で string db.collection.aggregate()
比較を実行する場合、コレクション、 、またはインデックスで構成された 照合 は無視されます。$replaceAll
たとえば、以下は照合強度 1
のサンプル コレクションを作成します。
db.createCollection( "myColl", { collation: { locale: "fr", strength: 1 } } )
照合強度が 1
の場合、基本文字のみが比較され、大文字と小文字や発音区別符号などの他の違いは無視されます。
次に、次の 3 つのサンプル ドキュメントを挿入します。
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
のように照合を尊重する演算子は、"Cafe" で文字列比較を実行すると、3 つのドキュメントすべてに一致することになります。これは、このコレクションの照合強度が 1
であるためです。
$replaceAll
および Unicode 正規化
$replaceAll
集計式は Unicode 正規化を実行しません。 つまり、すべての$replaceAll
式の string マッチングでは、一致を試みるときに Unicode で文字を表すのに使用されるコード ポイントの数が考慮されます。
例、文字 é
は、1 つのコード ポイントまたは 2 つのコード ポイントを使用して Unicode で表すことができます。
Unicode | 表示方法 | コード ポイント |
---|---|---|
\xe9 | é | 1 ( \xe9 ) |
e\u0301 | é | 2 ( e + \u0301 ) |
文字 が 1 つのコード ポイントを持つ Unicode で表される 検索$replaceAll
で を使用しても、stringé
é
入力 に 2 つのコード ポイントを使用するstring のインスタンスと一致しません。
次の表は、 が 1 つのコード ポイントまたは 2 つのコード ポイントで表される 入力 文字列と比較して、"Cafe" の 検索 に一致が発生するかどうかを示しています。stringé
この例の検索stringは、1 つのコード ポイントを使用して é
文字を表します。
例 | 一致 |
---|---|
{ $replaceAll: { input: "caf\xe9", find: "café", replacement: "CAFE" } } | はい |
{ $replaceAll: { input: "cafe\u0301", find: "café", replacement: "CAFE" } } | no |
$replaceAll
は Unicode 正規化を実行しないため、最初の string 比較のみが一致します。ここでは、検索文字列と入力文字列の両方がé
を表すために 1 つのコード ポイントを使用します。
例
次のドキュメントを使用して inventory
コレクションを作成します。
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" }