$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 :
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 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.