$replaceOne
Operator potoku agregacji został wprowadzony w MongoDB 4.4.
Ten operator zastępuje pierwsze wystąpienie ciągu wyszukiwania w ciągu wejściowym ciągiem zastępczym i zwraca wynik.
Jeśli szukany ciąg nie zostanie znaleziony, to $replaceOne
zwraca ciąg wejściowy.
Przykład
Załóżmy, że mamy kolekcję o nazwie products
z następującym dokumentem:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
Użyjmy $replaceOne
operator zastępujący pierwsze wystąpienie ciągu Left Handed
z innym ciągiem:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Wynik:
{ "_id" : 1, "product" : "Ambidextrous Screwdriver with Left Handed Carry Case" }
Zauważ, że w rzeczywistości istnieją dwa wystąpienia ciągu wyszukiwania (Left Handed
), ale tylko pierwsza instancja została zastąpiona.
Aby zastąpić wszystkie instancje, użyj $replaceAll
operatora.
Wrażliwość na wielkość liter
$replaceOne
operator rozróżnia wielkość liter.
Przykład:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Wynik:
{ "_id" : 1, "product" : "Left Handed Screwdriver with Left Handed Carry Case" }
W tym przypadku zmieniłem wielkość liter pojedynczego znaku w moim ciągu wyszukiwania. Zmieniłem Handed
do handed
. Spowodowało to, że ciąg wyszukiwania nie został znaleziony, więc nic nie zostało zastąpione. Dlatego zwrócono ciąg wejściowy.
Czułość znaków diakrytycznych
$replaceOne
operator jest wrażliwy na znaki diakrytyczne.
Załóżmy, że do naszej kolekcji dodamy następujący dokument:
{ "_id": 2, "product": "Toupée Tape" }
A teraz spróbujmy wyszukać i zamienić słowo Toupée
, ale zapomnij użyć akcentu ostrego:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Toupee", replacement: "Wig" } }
}
}
])
Wynik:
{ "_id" : 2, "product" : "Toupée Tape" }
Bez zmiany.
Nie umieściłem znaku diakrytycznego w wyszukiwanym ciągu, więc nie znaleziono dopasowania.
I znowu, ale tym razem dołączam znak diakrytyczny:
db.products.aggregate([
{ $match: { _id: 2 } },
{
$project:
{
product: { $replaceOne: { input: "$product", find: "Toupée", replacement: "Wig" } }
}
}
])
Wynik:
{ "_id" : 2, "product" : "Wig Tape" }
Tym razem wyszukiwany ciąg został znaleziony i zastąpiony.
Wyrażenia puste
Jeśli którekolwiek z wyrażeń dostarczonych do $replaceOne
są null
, wynik to null
.
Oto przykład podania null
pole operatora do $replaceOne
:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$product", find: null, replacement: "Ambidextrous" } }
}
}
]).pretty()
Wynik:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
W tym przypadku find
pole operatora było null
więc wynik był null
.
Brakujące pola
Jeśli input
lub find
pola operatora odnoszą się do pola, które nie istnieje, wynik to null
.
Przykład:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty()
Wynik:
{ "_id" : 1, "product" : null } { "_id" : 2, "product" : null }
Wartości niebędące ciągami
Wszystkie wyrażenia dostarczone do $replaceOne
musi ewaluować do ciągu lub null
. Podanie dowolnego innego typu zwraca błąd.
Załóżmy, że do naszej kolekcji dodamy następujący dokument:
{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }
Spróbujmy wyszukać i zamienić price
pole:
db.products.aggregate([
{
$project:
{
product: { $replaceOne: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
])
Wynik:
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
Zwraca błąd, zgodnie z oczekiwaniami.
Normalizacja Unicode
$replaceOne
operator nie wykonuje żadnej normalizacji Unicode.
Więcej informacji na ten temat oraz przykład można znaleźć w dokumentacji MongoDB.