$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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:618:17
example@sqldat.com/mongo/shell/assert.js:708:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/mongo/shell/collection.js:1046:12
@(shell):1:1 予想どおり、エラーが返されます。
ユニコード正規化
$replaceAll 演算子はユニコード正規化を実行しません。
これと例の詳細については、MongoDBのドキュメントを参照してください。