Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

130
Vistas
MongoDB Find documents created in past 7 days and return 0 on days where no document was created

I'm trying to find documents from last 7 days in my Mongo Database.

I'm able to receive data in desired format where specific date and numOfTickets created on that given date are returned:

{
    "datesUsed": {
        "startDate": "2022-04-02T14:42:14.223Z",
        "endDate": "2022-04-09T14:42:14.223Z"
    },
    "data": [
        {
            "date": "02/04/2022",
            "numOfTickets": 1
        },
        {
            "date": "03/04/2022",
            "numOfTickets": 1
        },
        {
            "date": "04/04/2022",
            "numOfTickets": 2
        },
        {
            "date": "06/04/2022",
            "numOfTickets": 1
        },
        {
            "date": "07/04/2022",
            "numOfTickets": 1
        },
        {
            "date": "08/04/2022",
            "numOfTickets": 2
        },
        {
            "date": "09/04/2022",
            "numOfTickets": 1
        }
    ]
}

The problem is that Mongo only returns data on days where a document was created, but returns nothing on days where no document was created - in this case 05/04/2022.

What I'm trying to achieve is to also include another JSON object that would say something in these terms:

{
            "date": "05/04/2022",
            "numOfTickets": 0
}

This is what I have so far:

const companyId = req.query.companyId;
    let dates = [];
    const data = [];
    // Last 7 days
    const endDate = new Date();
    const startDate = new Date(Date.now() - 604800000);

    // Find tickets from past 7 days
    const allCompanyTickets = await ticketModel
      .find({
        company_id: companyId,
        createdAt: { $gte: new Date(startDate), $lte: new Date(endDate) },
      })
      .sort({ createdAt: 1 });

      console.log(allCompanyTickets)

    // Push them to an array
    allCompanyTickets.forEach((ticket) => {
      dates.push(ticket.createdAt.toLocaleDateString());
    });

    // Count occurences of days in the dates array
    function countOccurrences(arr) {
      return arr.reduce(function (a, b) {
        a[b] = a[b] + 1 || 1;
        return a;
      }, []);
    }

    // Make an object from the data above
    const datesOrdered = countOccurrences(dates);

    // Give the data above keys and push it to a new array
    for (let key in datesOrdered) {
      const tempObj = { date: key, numOfTickets: datesOrdered[key] };
      data.push(tempObj);
    }

    res.status(200).json({ datesUsed: { startDate, endDate }, data: data });
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Something like this

db.ticketModel.aggregate([
  {
    $set: {
      datesUnused: {
        $range: [ 0, { $dateDiff: { startDate: "$startDate", endDate: "$endDate", unit: "day" } } ]
      }
    }
  },
  {
    $set: {
      datesUnused: {
        $map: {
          input: "$datesUnused",
          in: { 
            date: { 
               $dateAdd: { 
                  startDate: { $dateTrunc: { date: "$datesUsed.startDate", unit: "day" }, 
                  unit: "day", 
                  amount: "$$this" 
               } 
            },
            numOfTickets: 0
          }
        }
      }
    }
  },
  {
    $set: {
      data: {
        $filter: {
          input: "$datesUnused",
          cond: { $not: { $in: [ "$$this.date", "$data.date" ] } }
        }
      }
    }
  }
])

Mongo Playground

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda