Я в процессе изменения схемы для одной из моих коллекций MongoDB. (Я сохранял даты как строки, и теперь мое приложение хранит их как ISODate
, мне нужно вернуться и изменить все старые записи, чтобы использовать также ISODate
.) Я думаю, что знаю, как это сделать, используя обновление , но поскольку эта операция повлияет на десятки тысяч записей, я не решаюсь выпустить операцию, которую я не уверен на 100%. Есть ли способ сделать «сухой ход» обновления, которое покажет мне, для небольшого количества записей, оригинальную запись и как она будет изменена?Есть ли способ выполнить «сухой запуск» операции обновления?
Edit: Я закончил с использованием подхода добавления нового поля для каждой записи, а затем (после проверки того, что данные прав) переименовать это поле, чтобы соответствовать оригиналу. Выглядело это так:
db.events.find({timestamp: {$type: 2}})
.forEach(function (e) {
e.newTimestamp = new ISODate(e.timestamp);
db.events.save(e);
})
db.events.update({},
{$rename: {'newTimestamp': 'timestamp'}},
{multi: true})
Кстати, этот метод для преобразования строкового раза ISODate
с был то, что в конечном итоге работает. (Я получил идею от this SO answer.)
Моей рекомендацией было бы добавить ISODate в качестве нового поля. После подтверждения, что все выглядит хорошо, вы можете отменить дату строки. –
@JamesWahlin Имеет ли правильную идею, даже в SQL, которая поддерживает сухие пробеги, я бы этого не сделал – Sammaye
@JamesWahlin Можете ли вы добавить свой комментарий в качестве ответа? – bdesham