Как заменить строку в массиве коллекции с помощью MongoDB 4.2

У меня ниже Mongo Collection

{
   "name":"test",
   "work":"BA",
   "contacts":[
      {
         "company":"xyz",
         "email":"http://www.google.com/check/com/2"
      },
      {
         "company":"xyz1",
         "email":"http://www.google.com/verify/com/4"
      }
   ]
}

Я хочу заменить www.google.com из электронной почты контактов на www.test.com, не полный URL-адрес, а только определенную строку из электронной почты. Любая помощь приветствуется!

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Запрос1

  • $indexOfCP MongoDB >=3,6

ИгратьМонго

aggregate(
[{"$set": {"m": "www.google.com", "r": "www.test.com"}},
 {"$set": 
   {"contacts": 
     {"$map": 
       {"input": "$contacts",
        "in": 
         {"$mergeObjects": 
           ["$$this",
             {"email": 
               {"$let": 
                 {"vars": {"index": {"$indexOfCP": ["$$this.email", "$m"]}},
                  "in": 
                   {"$cond": 
                     [{"$eq": ["$$index", -1]}, "$$this.email",
                       {"$concat": 
                         [{"$substrCP": 
                             ["$$this.email", 0, {"$subtract": ["$$index", 0]}]},
                          "$r",
                           {"$substrCP": 
                             ["$$this.email",
                               {"$add": ["$$index", {"$strLenCP": "$m"}]},
                               {"$subtract": 
                                 [{"$strLenCP": "$$this.email"},
                                   {"$add": 
                                     ["$$index", {"$strLenCP": "$m"}]}]}]}]}]}}}}]}}}}},
 {"$unset": ["m", "r"]}])

Запрос2

  • $replaceAll MongoDB >= 4.4

ИгратьМонго

aggregate(
[{"$set": 
   {"contacts": 
     {"$map": 
       {"input": "$contacts",
        "in": 
         {"$mergeObjects": 
           ["$$this",
             {"email": 
               {"$replaceAll": 
                 {"input": "$$this.email",
                  "find": "www.google.com",
                  "replacement": "www.test.com"}}}]}}}}}])

Привет, Такис. Работает ли приведенный выше код запроса 1 для следующего URL-адреса: тест-тест1-тест2.ctest.com/ket/set вместо "www.google.com"

pmv 22.03.2022 15:43

первый запрос для 4.2, найдите индекс первой подстроки и замените его, если вы имеете в виду, что это работает. Он может завершиться ошибкой только в том случае, если у вас есть эта строка более 1 раза (в этом случае будет заменено только первое вхождение).

Takis 22.03.2022 17:57

Первый запрос работает, я получаю результат, извините! Я хочу обновить коллекцию также с помощью первого запроса.

pmv 22.03.2022 22:05

то же самое, вы можете использовать обновление конвейера, например это

Takis 22.03.2022 23:57

Да, это работает, спасибо, Такис, но оно добавляется туда, где у нас нет массива контактов в коллекциях, и добавляется с нулевым значением, например «контакты: ноль».

pmv 23.03.2022 09:01

попробуйте это, он проверяет, существуют ли контакты, иначе не добавляет поле

Takis 23.03.2022 15:39

Спасибо за вашу помощь, теперь это работает, как я могу сделать для электронной почты, если в объекте массива нет поля электронной почты («substrCP» создает проблемы, если поле электронной почты отсутствует)

pmv 24.03.2022 09:03

попробуй это думаю все будет ок

Takis 24.03.2022 17:20

Да, теперь все работает нормально, как и ожидалось, спасибо за вашу помощь и руководство! Очень ценится

pmv 25.03.2022 08:09

4.2+:

db.collection.update({
 "contacts.email": {
  $regex: "google"
 }
 },
[
 {
   $addFields: {
     contacts: {
       $map: {
         input: "$contacts",
         as: "c",
         in: {
           $mergeObjects: [
            {
              email: {
              $replaceOne: {
                input: "$$c.email",
                find: "www.google.com",
                replacement: "www.test.com"
              },    
             }
            },
            {
               company: "$$c.company"
            }
           ]
          }
         }
        }
       }
      }
     ])

Объяснение:

Обновление через конвейер агрегации с использованием replaceOne через $map/mergeObjects

детская площадка

Другие вопросы по теме