$replaceAll Operator potoku agregacji został wprowadzony w MongoDB 4.4.
Ten operator zastępuje wszystkie wystąpienia ciągu wyszukiwania w ciągu wejściowym ciągiem zastępczym i zwraca wynik.
Jeśli szukany ciąg nie zostanie znaleziony, to $replaceAll 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 $replaceAll operator zastępujący pierwsze wystąpienie ciągu Left Handed z innym ciągiem:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { input: "$product", find: "Left Handed", replacement: "Ambidextrous" } }
}
}
]).pretty() Wynik:
{
"_id" : 1,
"product" : "Ambidextrous Screwdriver with Ambidextrous Carry Case"
}
Zwróć uwagę, że oba wystąpienia ciągu wyszukiwania (Left Handed ) zostały zastąpione.
Jak sama nazwa wskazuje, $replaceAll zastępuje wszystkie wystąpienia ciągu wyszukiwania. Aby zastąpić tylko pierwszy wystąpienie, użyj $replaceOne .
Wrażliwość na wielkość liter
$replaceAll operator rozróżnia wielkość liter.
Przykład:
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { 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
$replaceAll 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: { $replaceAll: { 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: { $replaceAll: { 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 $replaceAll są null , wynik to null .
Oto przykład podania null pole operatora do $replaceAll :
db.products.aggregate([
{
$project:
{
product: { $replaceAll: { 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: { $replaceAll: { 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 $replaceAll 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: { $replaceAll: { input: "$price", find: "7.50", replacement: "10.50" } }
}
}
]) Wynik:
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 Zwraca błąd, zgodnie z oczekiwaniami.
Normalizacja Unicode
$replaceAll operator nie wykonuje żadnej normalizacji Unicode.
Więcej informacji na ten temat oraz przykład można znaleźć w dokumentacji MongoDB.