Я согласен с вами, что для человека нет никакой полезной цели. Я подозреваю, что он там, потому что он упрощает определение языка; это означает, что вещь, которая приходит после if
, такая же, как вещь, которая приходит после while
, например.
db.media.find({mediaContainer:"ContainerS3"}).forEach(function(e,i) {
e.url=e.url.replace("//a.n.com","//b.n.com");
db.media.save(e);
});
В настоящее время вы не можете использовать значение поля для его обновления. Таким образом, вам придется перебирать документы и обновлять каждый документ с помощью функции. Вот пример того, как вы можете это сделать здесь: MongoDB: Обновление документов с использованием данных из того же документа
Теперь вы можете это сделать!
Мы можем использовать скрипт Mongo для манипулирования данными «на лету». Это работает для меня!
Я использую этот скрипт для исправления моих адресных данных.
Пример текущего адреса: «No.12, FIFTH AVENUE».
Я хочу удалить последнюю резервную запятую, ожидаемый новый адрес «» № 12, ПЯТЫЙ ПРОСВЕТ ».
var cursor = db.myCollection.find().limit(100);
while (cursor.hasNext()) {
var currentDocument = cursor.next();
var address = currentDocument['address'];
var lastPosition = address.length - 1;
var lastChar = address.charAt(lastPosition);
if (lastChar == ",") {
var newAddress = address.slice(0, lastPosition);
currentDocument['address'] = newAddress;
db.localbizs.update({_id: currentDocument._id}, currentDocument);
}
}
Надеюсь, что это поможет!
Форматирование моего комментария к выбранному ответу (ответ @ Naveed) имеет скремблирование - поэтому добавление этого ответа. Все кредиты принадлежат Naveed.
Просто потрясающе. Мой случай был - у меня есть поле, которое представляет собой массив, поэтому мне пришлось добавить дополнительный цикл.
Мой запрос:
db.getCollection("profile").find({"photos": {$ne: "" }}).forEach(function(e,i) {
e.photos.forEach(function(url, j) {
url = url.replace("http://a.com", "https://dev.a.com");
e.photos[j] = url;
});
db.getCollection("profile").save(e);
eval(printjson(e));
})
nodejs. Использование пакета mongodb из npm
db.collection('ABC').find({url: /helloWorldt/}).toArray((err, docs) => {
docs.forEach(doc => {
let URL = doc.URL.replace('helloWorldt', 'helloWorld');
db.collection('ABC').updateOne({_id: doc._id}, {URL});
});
});
Для замены всех вхождений подстроки в вашем документе используйте:
db.media.find({mediaContainer:"ContainerS3"}).forEach(function(e,i) {
var find = "//a.n.com";
var re = new RegExp(find, 'g');
e.url=e.url.replace(re,"//b.n.com");
db.media.save(e);
});
На всякий случай, если вы используете примеры из ответов здесь и получаете «Обновлено 0 существующих записей» при запуске скрипта замены, проверьте, подключен ли ваш клиент к основному узлу MongoDB, который позволяет хранить / записывать изменения.
Вы можете попробовать выполнить конвейер агрегации в версии 3.4
.
Запрос агрегирования для замены строки поиска на заменяющую строку.
Логика заключается в поиске строки поиска ( $indexOfCP
), а затем $concat
, чтобы присоединиться ко всем частям ($substrCP
), части перед соответствующей строкой поиска, заменой строки и остальной части исходной строки.
Массовое обновление для записи нового структура url.
var bulk = db.getCollection(col).initializeUnorderedBulkOp();
var count = 0;
var batch = 1;
db.getCollection(col).aggregate([
{"$project":{
"URL":{
"$let":{
"vars":{
"len":{
"$strLenCP":"helloWorldt"},"start":{"$indexOfCP":["$URL","helloWorldt"]}
},
"in":{
"$concat":[
{"$substrCP":["$URL",0,"$$start"]},
"helloWorld",
{"$substrCP":[
"$URL",
{"$add":["$$start","$$len"]},
{"$subtract":[{"$strLenCP":"$URL"},{"$add":["$$start","$$len"]}]}
]}
]
}
}
}
}}
]).forEach(function(doc){
var _id = doc._id;
var url = doc.URL;
bulk.find({ "_id" : _id }).updateOne(
{ $set: {"URL" : url } }
);
count++;
if (count == batch) {
bulk.execute();
bulk = db.getCollection(col).initializeUnorderedBulkOp();
count = 0;
}
});
if (count > 0) {
bulk.execute();
}
db.getCollection("profile").find({"photos": {$ne: "" }}).forEach(function(e,i) { e.photos.forEach(function(url, j) { url = url.replace("http://a.com", "https://dev.a.com"); e.photos[j] = url; }); db.getCollection("profile").save(e); eval(printjson(e)); })
– Himel Nag Rana 11 October 2017 в 06:17