Чтобы преобразовать строку в формат даты вы должны перебирать результаты от операции поиска() и обновить коллекцию внутри цикла:
db.collection.find({}).forEach(function(doc) {
db.collection.update(
{ "_id": doc._id },
{
"$set": {
"request": new Date(doc.request),
"response": new Date(doc.response)
}
}
);
});
Perfomance с вышеуказанной операции обновления может быть нарушена, если дело с большими коллекциями, однако с помощью Bulk API может рационализировать обновления для развернутого эффективности за счет сокращения количества операций обновления отправленное на сервер, посылая один раз каждые 1000 операций в очереди:
var bulk = db.collection.initializeOrderedBulkOp(),
counter = 0;
db.collection.find({
"request": { "$exists": true, "$type": 2 },
"response": { "$exists": true, "$type": 2 }
}).forEach(function(doc) {
bulk.find({ "_id": doc._id }).updateOne({
"$set": {
"request": new Date(doc.request),
"response": new Date(doc.response)
}
});
counter++;
if (counter % 1000 == 0) {
// Execute per 1000 operations and re-initialize every 1000 update statements
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
});
// Clean up queues
if (counter % 1000 != 0){
bulk.execute();
}
обновив полей в соответствующие форматы даты, вы можете запустить следующую агрегацию трубопровод, чтобы получить результаты желания:
db.collection.aggregate([
{
"$project": {
"duration": { "$subtract": [ "$response", "$request" ] }
}
}
])
Может ли вы изменить свой вопрос, чтобы показать некоторые образцы документов и ожидаемый результат? – chridam
Я только что отредактировал. У вас есть решение? – user1697646