$replaceAll
operator pipa agregasi diperkenalkan di MongoDB 4.4.
Operator ini mengganti semua contoh string pencarian dalam string input dengan string pengganti dan mengembalikan hasilnya.
Jika string pencarian tidak ditemukan, maka $replaceAll
mengembalikan string input.
Contoh
Misalkan kita memiliki koleksi yang disebut products
dengan dokumen berikut:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
Mari gunakan $replaceAll
operator untuk mengganti instance pertama dari string Left Handed
dengan string lain:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Hasil:
{ "_id" : 1, "product" : "Ambidextrous Screwdriver with Ambidextrous Carry Case" }
Perhatikan bahwa kedua contoh string pencarian (Left Handed
) diganti.
Seperti namanya, $replaceAll
menggantikan semua kemunculan string pencarian. Untuk mengganti pertama kejadian, gunakan $replaceOne
.
Sensitivitas Huruf Besar
$replaceAll
operator peka huruf besar/kecil.
Contoh:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Hasil:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
Dalam hal ini, saya mengubah kasus karakter tunggal dalam string pencarian saya. Saya mengubah Handed
untuk handed
. Ini mengakibatkan string pencarian tidak ditemukan dan tidak ada yang diganti. Oleh karena itu, string input dikembalikan.
Sensitivitas Diakritik
$replaceAll
operator sensitif terhadap diakritik.
Misalkan kita menambahkan dokumen berikut ke koleksi kita:
{ "_id": 2, "product": "Toupée Tape" }
Dan sekarang mari kita coba mencari dan mengganti kata Toupée
, tapi lupa untuk menggunakan aksen yang tajam:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupee", replacement: "Wig" } }
}
}
])
Hasil:
{ "_id" : 2, "product" : "Toupée Tape" }
Tidak ada perubahan.
Saya tidak menyertakan diakritik dalam string pencarian saya sehingga tidak ada yang cocok.
Ini dia lagi, tapi kali ini saya sertakan diakritiknya:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Toupée", replacement: "Wig" } }
}
}
])
Hasil:
{ "_id" : 2, "product" : "Wig Tape" }
Kali ini string pencarian ditemukan dan diganti.
Ekspresi Null
Jika ada ekspresi yang diberikan ke $replaceAll
adalah null
, hasilnya null
.
Berikut ini contoh pemberian null
bidang operator ke $replaceAll
:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: null, replacement: "Ambidextrous" } }
}
}
]).pretty()
Hasil:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Dalam hal ini find
bidang operator adalah null
dan hasilnya adalah null
.
Bidang Tidak Ada
Jika input
atau find
field operator mengacu pada field yang tidak ada, maka hasilnya null
.
Contoh:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Hasil:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Nilai Non-String
Semua ekspresi disediakan untuk $replaceAll
harus mengevaluasi ke string atau null
. Memberikan jenis lain akan mengembalikan kesalahan.
Misalkan kita menambahkan dokumen berikut ke koleksi kita:
{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }
Coba kita cari dan ganti di price
bidang:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
])
Hasil:
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
Ini mengembalikan kesalahan, seperti yang diharapkan.
Normalisasi Unicode
$replaceAll
operator tidak melakukan normalisasi unicode.
Lihat dokumentasi MongoDB untuk informasi lebih lanjut tentang ini, dan sebuah contoh.