from mongoengine import connect, EmbeddedDocument, Document, StringField, IntField, ListField, EmbeddedDocumentField connect('Medidores', host='192.168.100.5', port=27017, username='mailScheduler', password='pqowieuryt') class Medicion(EmbeddedDocument): descripcion = StringField() registro = IntField() lectura = StringField() class Logs(Document): meta = {'collection': 'meters_logs'} serialNumber = StringField() meterLogNumber = IntField() logDate = StringField() saveDate = StringField() mediciones = ListField(EmbeddedDocumentField(Medicion)) class LogRetriever: def __init__(self, serial_number, log_number, register): self.serial_number = serial_number self.log_number = log_number self.register = register def _make_pipeline(self, start_date, end_date, aggregate_by): pipeline= [ {'$project': { 'serialNumber': 1, 'meterLogNumber': 1, 'mediciones': 1, 'logDate': 1, 'hour': {'$hour': {'$dateFromString': {'dateString': '$logDate'}}}, 'day': {'$dayOfMonth': {'$dateFromString': {'dateString': '$logDate'}}}, 'month': {'$month': {'$dateFromString': {'dateString': '$logDate'}}}, 'year': {'$year': {'$dateFromString': {'dateString': '$logDate'}}}, } }, {'$unwind': '$mediciones' }, {'$match': { 'serialNumber': self.serial_number, 'meterLogNumber': self.log_number, "mediciones.registro": self.register, 'logDate': {'$gte': start_date, '$lt': end_date}}}, {'$group': { '_id': aggregate_by, 'date': { '$min': '$logDate'}, 'total': {'$sum': { '$toInt': "$mediciones.lectura"}} } }, {'$sort': { 'date': -1 }} ] return pipeline def getByDay(self, start_date, end_date): aggregate_by = { 'hour': None, 'day': '$day', 'month': None, 'year': None } serial_number = '0223406118' log_number = 2 register = 4999 start_date = '2019-07-22 00:00:00' # String end_date = '2019-07-23 00:00:00' # String mediciones = Logs.objects.aggregate(*pipeline)