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

MongoDB $replaceOne

$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 $replaceOnenull , 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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Prosta implementacja tagowania z MongoDB

  2. Mongo przesuń do tablicy wewnątrz tablicy

  3. Sprawdzanie połączenia z MongoDB

  4. Wbudowana MongoDB podczas uruchamiania testów integracyjnych

  5. node.js nie może znaleźć modułu „mongodb”