2015-05-26 5 views
1

У меня есть коллекция содержит триста миллионов документов. Каждый документ имеет поле «created_at», который определяет время в виде строки, как это «Чт 5 февраля 9:25:38 +0000 2015»Эффективный способ изменения формата времени для всех документов в MongoDB

Я хочу изменить все поле «created_at» в поддерживаемый MongoDB формат времени. Так что я написал простой скрипт на Ruby:

collection.find.each do |document| 
    document[:created_at] = Time.parse document[:created_at] 
    collection.save(document) 
end 

Он сделал изменить формат времени, как я хотел, но мой сценарий работает уже в течение 50 часов, и нет никаких признаков отделки.

Есть ли лучший способ выполнить эту задачу? Сценарий оболочки MongoDB или скрипт Python также применим ко мне.

Кстати, эта коллекция не индексируется, поскольку он постоянно вкладывание документов

+0

Есть ли уникальный столбец, кроме _id – The6thSense

+0

Нет Эта коллекция хранит данные твитов. Даже идентификатор твита не уникален, так как API Twitter иногда возвращает повторяющиеся данные –

ответ

2

Использование mongo bulk update вы можете изменили дату ISODate формат, как показано ниже:

var bulk = db.collectionName.initializeOrderedBulkOp(); 
var counter = 0; 
db.collectionName.find().forEach(function(data) { 
    var updoc = { 
     "$set": {} 
    }; 
    var myKey = "created_at"; 
    updoc["$set"][myKey] = new Date(Date.parse(data.created_at)); 
    // queue the update 
    bulk.find({ 
     "_id": data._id 
    }).update(updoc); 
    counter++; 
    // Drain and re-initialize every 1000 update statements 
    if(counter % 1000 == 0) { 
     bulk.execute(); 
     bulk = db.collectionName.initializeOrderedBulkOp(); 
    } 
    }) 
    // Add the rest in the queue 
if(counter % 1000 != 0) bulk.execute(); 
+0

Вау, этот скрипт готов к использованию! Я попробую –

+0

Спасибо за этот элегантный скрипт! –

+0

@JimGB рад помочь вам :) – Yogesh

Смежные вопросы