$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 :
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
$replaceOne operator tidak melakukan normalisasi unicode.
Lihat dokumentasi MongoDB untuk informasi lebih lanjut tentang ini, dan sebuah contoh.