Обновление строкового значения в MongoDB с использованием aggregate [duplicate]

Я согласен с вами, что для человека нет никакой полезной цели. Я подозреваю, что он там, потому что он упрощает определение языка; это означает, что вещь, которая приходит после if, такая же, как вещь, которая приходит после while, например.

30
задан user1071979 25 September 2012 в 20:29
поделиться

8 ответов

db.media.find({mediaContainer:"ContainerS3"}).forEach(function(e,i) {
    e.url=e.url.replace("//a.n.com","//b.n.com");
    db.media.save(e);
});
70
ответ дан nilsi 18 August 2018 в 04:17
поделиться
  • 1
    это спасло мой день, спасибо @naveed – stackMonk 19 September 2016 в 08:20
  • 2
    не могли бы вы его уточнить? как он работает, что является средним значением кода? для других пользователей тоже? – doe 24 June 2017 в 19:49
  • 3
    Просто восхитительно. Мое дело было - у меня есть поле, которое представляет собой массив, поэтому мне пришлось добавить дополнительный цикл. Мой запрос: 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
  • 4
    @doe "e" здесь представлена ​​копия каждого найденного документа. Эта копия имеет свое значение для URL-адреса (это чувствительно к регистру, обратите внимание, что это не то же самое, что и «URL-адрес» опроса респондента), основанный на его исходном значении для URL-адреса. & Quot; е & Quot; сохраняет все исходные поля с одним измененным полем. Сохранение e обратно в коллекцию перезаписывает исходное «e». Нет необходимости в & quot; i & quot; здесь и его можно удалить из объявления функции. – JMess 7 April 2018 в 01:04
  • 5
    Это работало как прелесть! Спасибо, именно то, что я ищу! – user752746 31 July 2018 в 22:55

В настоящее время вы не можете использовать значение поля для его обновления. Таким образом, вам придется перебирать документы и обновлять каждый документ с помощью функции. Вот пример того, как вы можете это сделать здесь: MongoDB: Обновление документов с использованием данных из того же документа

6
ответ дан Community 18 August 2018 в 04:17
поделиться

Теперь вы можете это сделать!

Мы можем использовать скрипт 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);

  }
}

Надеюсь, что это поможет!

1
ответ дан Dac Nguyen 18 August 2018 в 04:17
поделиться

Форматирование моего комментария к выбранному ответу (ответ @ 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));
})
0
ответ дан Himel Nag Rana 18 August 2018 в 04:17
поделиться

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});
  });
});
3
ответ дан Lukas 18 August 2018 в 04:17
поделиться

Для замены всех вхождений подстроки в вашем документе используйте:

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
ответ дан Michael Michelis 18 August 2018 в 04:17
поделиться

На всякий случай, если вы используете примеры из ответов здесь и получаете «Обновлено 0 существующих записей» при запуске скрипта замены, проверьте, подключен ли ваш клиент к основному узлу MongoDB, который позволяет хранить / записывать изменения.

0
ответ дан Sergey Shcherbakov 18 August 2018 в 04:17
поделиться

Вы можете попробовать выполнить конвейер агрегации в версии 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(); 
 }
0
ответ дан Veeram 18 August 2018 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: