Eu tenho os seguintes documentos no MongoDB:
_id: ObjectID ("5ed6f89c76c78d4b10091b86")
DATA_HORA: 2019-10-21T03:00:00.000+00:00
LOCAL: 162266
RODOVIA: "GO-080"
KM: "KM25"
SENTIDO: "NEROPOLIS / GOIANIA"
VELOCIDADE_PERMITIDA: 40
VELOCIDADE_AFERIDA: 38
CLASSIFICAÇÃO: 1
PLACA: "JHL0000" *coloquei uma placa fictícia aqui por questões de proteção de dados
created_at: 2020-05-19T15:02:44.000+00:00
São mais de 1 milhão de registros neste formato. Eu fiz uma consulta que retorna a seguintes dados de placas por um período de observação igual à 3 dias. Nesta consulta retorna : Origem, Destino, Tempo_origem e Tempo_destino, Quantidade. Preciso de ajuda pra calcular da duração entre o tempo_origem e tempo_destino usando a função $Subtract (Aggregation) do MongoDB.
Estou usando Jupyter Notebook
from pymongo import MongoClient
import datetime
from pprint import pprint
import ast
import pandas as pd
import itertools
import multiprocessing
from itertools import permutations
import time
import numpy as np
import csv
ini = time.time()
print('Iniciando Consulta')
rows_list = []
lista = []
for number in range(7,10):
print(number)
consulta = collection.aggregate(
[
{
'$match': {
'DATA_HORA': {
'$gte': datetime.datetime(2019,11,number, 0, 0, 0),
'$lt': datetime.datetime(2019,11,number+1, 0, 0, 0)
}
}
},{
'$match': {
'PLACA': {
'$ne': None
}
}
},{
'$group': {
'_id': {
'data': {
'$dateToString': {
'format': '%Y-%m-%d',
'date': '$DATA_HORA'
}
},
'placa': '$PLACA'
},
'origem': {
'$first': '$LOCAL'
},
'tempo_origem':{
'$first': {'$dateToString': {'format': '%Y-%m-%d %H:%M:%S','date': '$DATA_HORA'}}
},
'destino': {
'$last': '$LOCAL'
},
'tempo_destino':{
'$last': {'$dateToString': {'format': '%Y-%m-%d %H:%M:%S','date': '$DATA_HORA'}}
}
}
},
{
'$project': {
'_id': 0,
'Origem': '$origem',
'Destino': '$destino',
'Tempo_origem':'$tempo_origem' ,
'Tempo_destino':'$tempo_destino',
'Quantidade': '1'
}
}
],
allowDiskUse= True)
for i in consulta:
lista.append(i)
print('Consulta finalizada \n')
fim = time.time()
print (f'Duração da consulta (em segundos) para um período de {number} dias', fim-ini,'\n')