4
respostas

Uso do $Substract

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')
4 respostas

Olá Luciana, tudo bem?

Nunca usei o subtract para realizar a subtração entre duas datas, porém sei que esse calculo é feito em milissegundos, então indico a você a documentação do MongoDB, pois na documentação é abordado com mais detalhes sobre este assunto e também é disponibilizados alguns exemplos sobre o uso do subtract e que pode ajudar você a aplicar o subtract no seu código.

Espero ter ajudado e bons estudos!

Olha confesso que não me ajudou em nada porque eu já olhei o manual do MongoDB. Porém como é uma consulta muito avançada, eu preciso de alguem que me ajude.

Certo Luciana, depois de pesquisar mais um pouco, consegui realizar a subtração entre datas, retornando a diferença em horas:

db.teste.aggregate( [ {
$addFields : 
    {
        "resultado" : 
        {
    $divide : [{$subtract: ["$data_destino","$data_origem"]}, 3600000]
        }
    }
 } ] )
  • Utilizei o $addFields para criar um campo para receber o resultado, neste caso foi o campo resultado.

  • Utilizei o $divide para dividir o resultado da subtração entre as datas por 3600000, dessa forma o resultado foi convertido para horas.

  • E dentro do $divide utilizei o $subtract para realizar a subtração entre as datas armazenadas em $data_destino e $data_origem e o resultado foi armazenado no campo resultado.

subtração de datas

Espero ter ajudado e bons estudos!

muito bom ! me ajudou muito! muito obrigada. Fiquei muito satisfeita!