$replaceOne(集計)
定義
$replaceOne
入力文字string内の検索文字列の最初のインスタンスを置換文字stringで置き換えstring 。
出現するものが見つからない場合、
$replaceOne
は入力 string として評価されます。$replaceOne
は大文字と小文字、および発音区別符号を区別し、コレクションに存在する照合を無視します。
構文
$replaceOne
演算子には次の演算子式の構文があります。
{ $replaceOne: { input: <expression>, find: <expression>, replacement: <expression> } }
演算子フィールド
フィールド | 説明 |
---|---|
find を適用する string 。 string または に解決される任意の有効な式を指定できます。 | |
指定された入力 内で検索する string です。 string または に解決される任意の有効な式を指定できます。 | |
動作
入力 内に find$replaceOne
の出現が見つからない場合、 は入力string と評価されます。
input 、 find 、および置換式は、string またはnull
に評価される必要があります。または$replaceOne
はエラーで失敗します。
$replaceOne
および NULL 値
inputまたはfindが欠落しているフィールドを参照する場合、 null
が返されます。
input 、 find 、または 置換 の いずれか がnull
と評価されると、 式全体が$replaceOne
と評価されます。null
例 | 結果 |
---|---|
|
|
|
|
|
|
$replaceOne
と 照合
すべての$replaceOne
式に対する string マッチングでは、常に大文字と小文字が区別され、発音区別符号が区別されます。 $replaceOne
で string 比較を実行する場合、構成された照合は無視されます。
たとえば、以下は照合強度 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é" } ])
次の$replaceOne
操作は、 name
フィールド内の "Cafe" の最初のインスタンスを検索して置き換えようとします。
db.myColl.aggregate([ { $addFields: { resultObject: { $replaceOne: { input: "$name", find: "Cafe", replacement: "CAFE" } } } } ])
$replaceOne
はこのコレクションに構成された照合を無視するため、操作はドキュメント2
の "Cafe" のインスタンスのみと一致します。
{ "_id" : 1, "name" : "cafe", "resultObject" : "cafe" } { "_id" : 2, "name" : "Cafe", "resultObject" : "CAFE" } { "_id" : 3, "name" : "café", "resultObject" : "café" }
$match
のように照合を尊重する演算子は、"Cafe" で文字列比較を実行すると、3 つのドキュメントすべてに一致することになります。これは、このコレクションの照合強度が 1
であるためです。
$replaceOne
および Unicode 正規化
$replaceOne
集計式は Unicode 正規化を実行しません。 つまり、すべての$replaceOne
式の string マッチングでは、一致を試みるときに Unicode で文字を表すのに使用されるコード ポイントの数が考慮されます。
例、文字 é
は、1 つのコード ポイントまたは 2 つのコード ポイントを使用して Unicode で表すことができます。
Unicode | 表示方法 | コード ポイント |
---|---|---|
|
| 1 ( |
|
| 2 ( |
文字 が 1 つのコード ポイントを持つ Unicode で表される 検索$replaceOne
で を使用しても、stringé
é
入力 に 2 つのコード ポイントを使用するstring のインスタンスと一致しません。
次の表は、 が 1 つのコード ポイントまたは 2 つのコード ポイントで表される 入力 文字列と比較して、"Cafe" の 検索 に一致が発生するかどうかを示しています。stringé
この例の検索stringは、1 つのコード ポイントを使用して é
文字を表します。
例 | 一致 |
---|---|
| はい |
| no |
$replaceOne
は 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
フィールド内の「青い塗料」の最初のインスタンスを「赤色の塗料」に置き換えます。
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
では、「青い塗料」 の最初に一致したインスタンスのみが置き換えられることに注意してください。