Добавить новое поле в коллекцию со значением существующего поля - PullRequest
20 голосов
/ 10 февраля 2012

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

В частности, я бы хотел перейти от этого:

# db.foo.findOne()
    {
        "_id"     : ObjectId("4f25c828eb60261eab000000"),
        "created" : ISODate("2012-01-29T16:28:56.232Z"),
        "..."     : ...
    }

к этому:

# db.foo.findOne()
    {
        "_id"      : ObjectId("4f25c828eb60261eab000000"),
        "created"  : ISODate("2012-01-29T16:28:56.232Z"),  
        "event_ts" : ISODate("2012-01-29T16:28:56.232Z"),  #same as created
        "..."      : ...
    }

(Все новые документы в этой коллекции не будут иметь этой специфической избыточности, но я хочу сделать это для моих существующих документов)

Ответы [ 4 ]

45 голосов
/ 10 февраля 2012
function addEventTsField(){
    db.foo.find().forEach(function(doc){
         db.foo.update({_id:doc._id}, {$set:{"event_ts":doc.created}});
    });
}

Запуск с консоли:

addEventTsField();
2 голосов
/ 10 февраля 2012

Нет, это невозможно. Всего лишь два шага, которые вы, вероятно, знаете:

  1. Загрузить документ, прочитать поле. (вы можете загрузить только определенные поля : _id и created в вашем случае, если производительность является проблемой)
  2. Атомарное обновление документа (установите event_ts, используя загруженное поле created)
0 голосов
/ 14 января 2015

Если это одноразовая вещь, то это не страшно. Запустите запрос типа "db.foo.find ();" в вашем Mongo Shel и вставьте весь вывод в редактор, такой как Textpad или Sublime text, сделайте блок столбца (В возвышенном тексте это Ctrl + колесо прокрутки, нажмите и перетащите), вставьте его, который будет распространяться на другое поле, переименуйте вновь вставьте столбец так, как вы хотите, после этого выполните регулярное выражение, чтобы просто отредактировать всю связку как "^" с помощью "db.foo.insert ({" и "$" как "});"

Это похоже на следующие шаги.

  1. Вы вставили вывод как {'field1': значение, 'field2': значение2, 'field3': значение4};
    1. скопировать последний набор и расширить, используя блок столбца редактора. {'field1': значение, 'field2': значение2, 'field3': значение4};
    2. Теперь вставьте соответствующие слова, чтобы они выглядели как команда для монго db.foo.insert ({'field1': значение, 'field2': значение2, 'field3': значение4});
    3. Теперь скопируйте их все и вставьте в свою оболочку Монго, которая сделает все за вас, как вы этого хотите. Протестируйте его один раз и переделайте все сразу после очистки коллекции, иначе он вставит дубликаты. Также удалите поля «_id» в выводе, так как он будет конфликтовать при попытке вставить снова !!

Теперь каждая строка в вашем редакторе показывает допустимую команду Монго, которую можно вставить в вашу оболочку, чтобы вставить новый документ в вашу коллекцию. так что протестируйте его один раз, и он будет работать нормально, очистите всю свою коллекцию, как "db.foo.remove ({});" и вставьте всю команду из редактора, который сделает это в giffy.

Это может быть сложно, когда вы пытаетесь в первый раз, но если вы все сделаете правильно, вам будет удобно работать вместе, когда вы этого захотите .... !!

0 голосов
/ 10 февраля 2012

, поскольку ваш код уже знает, как обрабатывать event_ts, зачем вам копировать данные? вместо этого вы можете переименовать поле:

{ $rename : { old_field_name : new_field_name } }

См. http://www.mongodb.org/display/DOCS/Updating

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...