Подтвердить что ты не робот

Добавить новое поле в коллекцию со значением существующего поля

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

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

# 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
        "..."      : ...
    }

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

4b9b3361

Ответ 1

function addEventTsField(){
    db.foo.find().forEach(function(doc){
         db.foo.update({_id:doc._id}, {$set:{"event_ts":doc.created}});
    });
}

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

addEventTsField();

Ответ 2

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

  • Загрузите документ, прочитайте поле. (вы можете загрузить только конкретные поля: _id и created в вашем случае, если производительность является проблемой)
  • Атомное обновление документа (установите event_ts с помощью загруженного поля created)

Ответ 3

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

{ $rename : { old_field_name : new_field_name } }

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

Ответ 4

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

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

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

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

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