$replaceAll
集約パイプライン演算子はMongoDB4.4で導入されました。
この演算子は、入力文字列内の検索文字列のすべてのインスタンスを置換文字列に置き換え、結果を返します。
検索文字列が見つからない場合は、$replaceAll
入力文字列を返します。
例
products
というコレクションがあるとします。 次のドキュメントで:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
$replaceAll
を使用しましょう 文字列の最初のインスタンスを置き換える演算子Left Handed
別の文字列で:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
結果:
{ "_id" : 1, "product" : "Ambidextrous Screwdriver with Ambidextrous Carry Case" }
検索文字列の両方のインスタンス(Left Handed
)が置き換えられました。
名前が示すように、$replaceAll
すべてを置き換えます 検索文字列の出現。 最初のだけを置き換えるには 発生するには、$replaceOne
を使用します 。
大文字と小文字の区別
$replaceAll
演算子では大文字と小文字が区別されます。
例:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
結果:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
この場合、検索文字列の1文字の大文字と小文字を変更しました。 Handed
を変更しました handed
。その結果、検索文字列が見つからなかったため、何も置き換えられませんでした。したがって、入力文字列が返されました。
発音区別符号の感度
$replaceAll
演算子は発音区別符号に敏感です。
コレクションに次のドキュメントを追加するとします。
{ "_id": 2, "product": "Toupée Tape" }
それでは、Toupée
という単語を検索して置き換えてみましょう。 、ただし、アキュートアクセントを使用することを忘れてください:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupee", replacement: "Wig" } }
}
}
])
結果:
{ "_id" : 2, "product" : "Toupée Tape" }
変化なし。
検索文字列に発音区別符号を含めなかったため、一致するものはありませんでした。
ここでもまたですが、今回は発音区別符号を含めます:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupée", replacement: "Wig" } }
}
}
])
結果:
{ "_id" : 2, "product" : "Wig Tape" }
今回は検索文字列が見つかり、置き換えられました。
ヌル式
$replaceAll
に提供された式のいずれかが null
です 、結果はnull
です 。
null
を提供する例を次に示します。 $replaceAll
への演算子フィールド :
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: null, replacement: "Ambidextrous" } }
}
}
]).pretty()
結果:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
この場合、find
演算子フィールドはnull
でした そのため、結果はnull
でした 。
欠落しているフィールド
input
の場合 またはfind
演算子フィールドは存在しないフィールドを参照し、結果はnull
になります 。
例:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
結果:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
非文字列値
$replaceAll
に提供されるすべての式 文字列またはnull
に評価する必要があります 。他のタイプを指定すると、エラーが返されます。
コレクションに次のドキュメントを追加するとします。
{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }
price
で検索して置き換えてみましょう フィールド:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
])
結果:
Error: command failed: { "ok" : 0, "errmsg" : "$replaceAll requires that 'input' be a string, found: 7.50", "code" : 51746, "codeName" : "Location51746" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
予想どおり、エラーが返されます。
ユニコード正規化
$replaceAll
演算子はユニコード正規化を実行しません。
これと例の詳細については、MongoDBのドキュメントを参照してください。