У меня ниже 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-адрес, а только определенную строку из электронной почты. Любая помощь приветствуется!

Запрос1
$indexOfCP MongoDB >=3,6aggregate(
[{"$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.4aggregate(
[{"$set":
{"contacts":
{"$map":
{"input": "$contacts",
"in":
{"$mergeObjects":
["$$this",
{"email":
{"$replaceAll":
{"input": "$$this.email",
"find": "www.google.com",
"replacement": "www.test.com"}}}]}}}}}])
первый запрос для 4.2, найдите индекс первой подстроки и замените его, если вы имеете в виду, что это работает. Он может завершиться ошибкой только в том случае, если у вас есть эта строка более 1 раза (в этом случае будет заменено только первое вхождение).
Первый запрос работает, я получаю результат, извините! Я хочу обновить коллекцию также с помощью первого запроса.
то же самое, вы можете использовать обновление конвейера, например это
Да, это работает, спасибо, Такис, но оно добавляется туда, где у нас нет массива контактов в коллекциях, и добавляется с нулевым значением, например «контакты: ноль».
попробуйте это, он проверяет, существуют ли контакты, иначе не добавляет поле
Спасибо за вашу помощь, теперь это работает, как я могу сделать для электронной почты, если в объекте массива нет поля электронной почты («substrCP» создает проблемы, если поле электронной почты отсутствует)
попробуй это думаю все будет ок
Да, теперь все работает нормально, как и ожидалось, спасибо за вашу помощь и руководство! Очень ценится
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
Привет, Такис. Работает ли приведенный выше код запроса 1 для следующего URL-адреса: тест-тест1-тест2.ctest.com/ket/set вместо "www.google.com"