$replaceOne
operator pipa agregasi diperkenalkan di MongoDB 4.4.
Operator ini mengganti instance pertama dari string pencarian dalam string input dengan string pengganti dan mengembalikan hasilnya.
Jika string pencarian tidak ditemukan, maka $replaceOne
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 $replaceOne
operator untuk mengganti instance pertama dari string Left Handed
dengan string lain:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Hasil:
{ "_id" : 1, "product" : "Ambidextrous Screwdriver with Left Handed Carry Case" }
Perhatikan bahwa sebenarnya ada dua contoh string pencarian (Left Handed
) tetapi hanya contoh pertama yang diganti.
Untuk mengganti semua instance, gunakan $replaceAll
operator.
Sensitivitas Huruf Besar
$replaceOne
operator peka huruf besar/kecil.
Contoh:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { 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
$replaceOne
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: { $replaceOne: { 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: { $replaceOne: { 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 $replaceOne
adalah null
, hasilnya null
.
Berikut ini contoh pemberian null
bidang operator ke $replaceOne
:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { 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: { $replaceOne: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Hasil:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Nilai Non-String
Semua ekspresi disediakan untuk $replaceOne
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: { $replaceOne: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
])
Hasil:
Error: command failed: { "ok" : 0, "errmsg" : "$replaceOne 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
$replaceOne
operator tidak melakukan normalisasi unicode.
Lihat dokumentasi MongoDB untuk informasi lebih lanjut tentang ini, dan sebuah contoh.