Ответ 1
function addEventTsField(){
db.foo.find().forEach(function(doc){
db.foo.update({_id:doc._id}, {$set:{"event_ts":doc.created}});
});
}
Запустите с консоли:
addEventTsField();
Я хотел бы добавить новое поле в коллекцию, при этом значение нового поля будет установлено на значение существующего поля.
В частности, я хотел бы перейти от этого:
# 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
"..." : ...
}
(Новые документы в этой коллекции не все имеют эту специфическую избыточность, но я хочу сделать это для моих существующих документов)
function addEventTsField(){
db.foo.find().forEach(function(doc){
db.foo.update({_id:doc._id}, {$set:{"event_ts":doc.created}});
});
}
Запустите с консоли:
addEventTsField();
Нет, это невозможно. Только два шага, которые вы, вероятно, знаете:
_id
и created
в вашем случае, если производительность является проблемой)event_ts
с помощью загруженного поля created
)так как ваш код уже знает, как обрабатывать event_ts, зачем вам нужно копировать данные? вы можете вместо этого переименовать поле:
{ $rename : { old_field_name : new_field_name } }
Если это одно дело, это не имеет большого значения. Выполните запрос типа "db.foo.find();" на вашем майго-полке и вставьте весь вывод в редактор, например Textpad или Sublime, выполните блок-столбец (в возвышенном тексте нажмите Ctrl + клик мыши и перетащите), вставьте его, который перейдет в другое поле, переименуйте новый вставляемый столбец, как вы хотите, сделайте регулярное выражение, чтобы просто отредактировать всю связку как "^" с помощью "db.foo.insert({" и "$" as "});
Это похоже на следующие шаги.
- Вы вставили вывод как {'field1': value, 'field2': value2, 'field3': value4};
- скопировать последний набор и продолжить с помощью блока столбца редактора {'field1': value, 'field2': value2, 'field3': value4};
- Теперь вставьте соответствующие слова, чтобы они выглядели как команда для монго db.foo.insert({'field1': value, 'field2': value2, 'field3': value4});
- Теперь скопируйте их все и вставьте в свою оболочку mongo, которая просто сделает все для вас, как вы этого хотите. Протестируйте его один раз и повторите все это сразу после того, как вы очистите коллекцию, иначе он будет вставлять дубликаты. Также удалите поля "_id" в выходном файле, так как они конфликтуют при попытке вставить снова!
Теперь каждая строка в вашем редакторе показывает действительную команду mongo, которая может быть вставлена в оболочку, чтобы вставить новый документ в вашу коллекцию. поэтому проверьте его один раз, и он отлично работает, очистите всю вашу коллекцию, как "db.foo.remove({});" и вставьте всю команду из редактора, которая будет делать это в giffy.
Это может быть сложно, когда вы пытаетесь в первый раз, но если вы правильно это сделаете, это будет удобной вещью для вас, чтобы работать, когда захотите...!!