MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB $replaceAll

$replaceAll операторът на конвейер за агрегиране беше въведен в MongoDB 4.4.

Този оператор замества всички екземпляри на низ за търсене във входен низ със заместващ низ и връща резултата.

Ако низът за търсене не бъде намерен, тогава $replaceAll връща входния низ.

Пример

Да предположим, че имаме колекция, наречена products със следния документ:

{
	"_id" : 1,
	"product" : "Left Handed Screwdriver with Left Handed Carry Case"
}

Нека използваме $replaceAll оператор за замяна на първия екземпляр на низа Left Handed с друг низ:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { input: "$product", find: "Left Handed", replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Резултат:

{
	"_id" : 1,
	"product" : "Ambidextrous Screwdriver with Ambidextrous Carry Case"
}

Обърнете внимание, че и двата екземпляра на низа за търсене (Left Handed ) бяха заменени.

Както подсказва името, $replaceAll замества всички поява на търсещия низ. За замяна само на първия възникване, използвайте $replaceOne .

Чувствителност на регистрите

$replaceAll Операторът е чувствителен към малките букви.

Пример:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { input: "$product", find: "Left handed", replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Резултат:

{
	"_id" : 1,
	"product" : "Left Handed Screwdriver with Left Handed Carry Case"
}

В този случай промених регистъра на буквите на един знак в моя низ за търсене. Промених Handed на handed . Това доведе до това, че низът за търсене не беше намерен и така нищо не беше заменено. Следователно входният низ беше върнат.

Диакритична чувствителност

$replaceAll Операторът е чувствителен към диакритика.

Да предположим, че добавяме следния документ към нашата колекция:

{ "_id": 2, "product": "Toupée Tape" }

А сега нека се опитаме да потърсим и заменим думата Toupée , но забравете да използвате острото ударение:

db.products.aggregate([
    { $match: { _id: 2 } },
   {
     $project:
      {
         product: { $replaceAll: { input: "$product", find: "Toupee", replacement: "Wig" } }
      }
   }
])

Резултат:

{ "_id" : 2, "product" : "Toupée Tape" }

Няма промяна.

Не включих диакритиката в моя низ за търсене и така нямаше съвпадение.

Ето го отново, но този път включвам диакритиката:

db.products.aggregate([
    { $match: { _id: 2 } },
   {
     $project:
      {
         product: { $replaceAll: { input: "$product", find: "Toupée", replacement: "Wig" } }
      }
   }
])

Резултат:

{ "_id" : 2, "product" : "Wig Tape" }

Този път низът за търсене беше намерен и заменен.

Нулеви изрази

Ако някой от изразите, предоставени на $replaceAll са null , резултатът е null .

Ето пример за предоставяне на null операторно поле до $replaceAll :

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { input: "$product", find: null, replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Резултат:

{ "_id" : 1, "product" : null }
{ "_id" : 2, "product" : null }

В този случай find полето на оператора беше null и така резултатът беше null .

Липсващи полета

Ако input или find полетата на оператора се отнасят до поле, което не съществува, тогава резултатът е null .

Пример:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Резултат:

{ "_id" : 1, "product" : null }
{ "_id" : 2, "product" : null }

Ненизови стойности

Всички изрази, предоставени на $replaceAll трябва да се оценява като низ или null . Предоставянето на друг тип връща грешка.

Да предположим, че добавяме следния документ към нашата колекция:

{ "_id" : 3, "product" : "Long Weight", "price" : NumberDecimal("7.50") }

Нека се опитаме да направим търсене и замяна на price поле:

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceAll: { input: "$price", find: "7.50", replacement: "10.50" } }
      }
   }
])

Резултат:

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

Връща грешка, както се очаква.

Нормализация на Unicode

$replaceAll операторът не извършва нормализиране на Unicode.

Вижте документацията на MongoDB за повече информация и пример.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Връщане на резултатите mongoose в заявката за намиране към променлива

  2. Как да намерите неизползвани индекси в MongoDB?

  3. Актуализирайте множество документи по набор от идентификатори. Мангуста

  4. Как да започнете с автоматизацията на базата данни

  5. Променете типа на полето в агрегирането на mongoDB и използва ли $lookup индекс върху полета или не?