MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB $replaceAll

$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 $replaceAllnull , 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 :
[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

$replaceAll operator nie wykonuje żadnej normalizacji Unicode.

Więcej informacji na ten temat oraz przykład można znaleźć w dokumentacji MongoDB.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak można reprezentować pola MongoDB GeoJSON w schemacie Mongoose?

  2. Wiele wyrażeń $elemMatch do dopasowywania wartości tablicy przy użyciu $all w MongoDB?

  3. Jak mogę jednocześnie zapisać wiele dokumentów w Mongoose/Node.js?

  4. Tworzenie obszaru administracyjnego w pięć minut za pomocą AdminBro, express, mongoDB, mongoose

  5. MongoDB Seattle 2014