Поскольку 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 });
Am Я правильно понять: вы хотите добавить 3 дня до даты каждого документа ?! – deceze
@deceze да, точно. Извините за непростой вопрос. – Josef