2015-12-28 4 views
1

Можно ли вычесть строку в строку с форматом даты?Как преобразовать строку в дату, а затем вычесть дату в запросе мангуста?

Пример:

У меня есть два поля: запрос и ответ (Формат строки: гггг/мм/дд чч: мм: сс).

У меня есть запись:

{ 
_id: 1, 
request: 2015/12/28 12:10:10, 
response: 2015/12/28 12:10:15 
} 

и ожидать результата:

{ 
_id: 1, 
duration: 5 
} 

Можно ли преобразовать строку в дату, то с помощью $subtract (агрегацию) вычесть два значения?

Я пытаюсь найти и найти еще.

+0

Может ли вы изменить свой вопрос, чтобы показать некоторые образцы документов и ожидаемый результат? – chridam

+0

Я только что отредактировал. У вас есть решение? – user1697646

ответ

2

Чтобы преобразовать строку в формат даты вы должны перебирать результаты от операции поиска() и обновить коллекцию внутри цикла:

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" ] } 
     } 
    } 
]) 
+1

Это потрясающе ... – Thalaivar

+0

потрясающий! Я стараюсь. Тем временем ждет ваш комментарий. Я пытаюсь получить данные из базы данных и длительности обработки на сервере. – user1697646

+0

@chridam: Могу я задать вам вопрос? Можно ли агрегировать лимитированный документ? Пример: сначала всего 100 записей. – user1697646

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