2016-01-08 4 views
0

У меня есть БД с именами и датами. Мне нужно изменить старую дату с датой, которая составляет +3 дня после этого. Например, oldaDate - 01.02.2015, новый - 03.02.2015. Я пытался просто поставить другую дату для всех файлов, но это означает, что все экзамены будут в один день.Как изменить дату и время в MongoDB?

$ db.getCollection('school.exam').update({}, { $set : { "oldDay" : new ISODate("2016-01-11T03:34:54Z") } }, true, true);

Проблема просто заменить старую дату с некоторыми случайными дней.

+1

Am Я правильно понять: вы хотите добавить 3 дня до даты каждого документа ?! – deceze

+0

@deceze да, точно. Извините за непростой вопрос. – Josef

ответ

1

Поскольку MongoDB еще не поддерживает $inc оператора применять на даты (просмотреть билет JIRA на этом here), в качестве альтернативы, чтобы увеличить поле даты, вам нужно будет перебирать курсор возвращенного метод find() с использованием метода forEach(), в цикле получить преобразовать старое поле даты для временной метки, добавить количество дней в миллисекундах метки времени, а затем обновить поле с помощью оператора в $set.

Воспользуйся помощью Bulk API для оптовых обновлений, которые предлагают более высокую производительность, как вы будете отправлять операции на сервер в партиях говорят 1000, что дает вам лучшую производительность, как вы не отправляете каждый запрос к серверу , всего один раз в каждые 1000 запросов.

Следующий пример демонстрирует этот подход. В первом примере используется Bulk API, доступный в версиях MongoDB >= 2.6 and < 3.2. Он обновляет все документов в коллекции, добавив 3 дня в поле Даты:

var bulk = db.getCollection("school.exam").initializeUnorderedBulkOp(), 
    counter = 0, 
    daysInMilliSeconds = 86400000, 
    numOfDays = 3; 

db.getCollection("school.exam").find({ "oldDay": { $exists : true, "$type": 2 }}).forEach(function (doc) { 
    var incDate = new Date(doc.oldDay.getTime() + (numOfDays * daysInMilliSeconds)); 
    bulk.find({ "_id": doc._id }).updateOne({ 
     "$set": { "oldDay": incDate } 
    }); 

    counter++; 
    if (counter % 1000 == 0) { 
     bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements 
     bulk = db.getCollection('school.exam').initializeUnorderedBulkOp(); 
    } 
}) 

if (counter % 1000 != 0) { bulk.execute(); } 

Следующий пример относится к новой MongoDB версии 3.2 который с тех пор deprecated the Bulk API и при условии, более новый набор интерфейсов, используя bulkWrite():

var bulkOps = [], 
    daysInMilliSeconds = 86400000, 
    numOfDays = 3; 

db.getCollection("school.exam").find({ "oldDay": { $exists : true, "$type": 2 }}).forEach(function (doc) { 
    var incDate = new Date(doc.oldDay.getTime() + (numOfDays * daysInMilliSeconds)); 
    bulkOps.push(   
     { 
      "updateOne": { 
       "filter": { "_id": doc._id } ,    
       "update": { "$set": { "oldDay": incDate } } 
      }   
     }   
    );  
}) 

db.getCollection("school.exam").bulkWrite(bulkOps, { 'ordered': true }); 
Смежные вопросы