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

MongoDB $replaceOne

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

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

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

Пример

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

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

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

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

Резултат:

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

Забележете, че всъщност има два екземпляра на низа за търсене (Left Handed ), но само първата инстанция беше заменена.

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

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

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

Пример:

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

Резултат:

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

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

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

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

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

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

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

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

Резултат:

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

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

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

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

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

Резултат:

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

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

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

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

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

db.products.aggregate([
   {
     $project:
      {
         product: { $replaceOne: { 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: { $replaceOne: { input: "$oops", find: "Left Handed", replacement: "Ambidextrous" } }
      }
   }
]).pretty()

Резултат:

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

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

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

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

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

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

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

Резултат:

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

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

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

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

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да изберете едно поле за всички документи в колекция MongoDB?

  2. Как да заявя mongodb с „like“ с помощта на java api?

  3. MongoDB:агрегирано поле за добавяне на $project със статична стойност

  4. mongoDB :Създаване на ObjectId за всяко ново дете, добавено към полето на масива

  5. mongodb получава _id като низ в заявката за намиране