sql >> Base de Datos >  >> NoSQL >> MongoDB

Agregar $grupo para múltiples rangos de fechas

Debe determinar condicionalmente la clave de agrupación en función de dónde se encuentra la fecha actual entre el rango. Esto se logra básicamente a través de $cond con condiciones anidadas y la variante lógica de $lt :

// work out dates somehow
var today = new Date(),
    oneDay = ( 1000 * 60 * 60 * 24 ),
    thirtyDays = new Date( today.valueOf() - ( 30 * oneDay ) ),
    fifteenDays = new Date( today.valueOf() - ( 15 * oneDay ) ),
    sevenDays = new Date( today.valueOf() - ( 7 * oneDay ) );

db.collection.aggregate([
    { "$match": {
        "date": { "$gte": thirtyDays }
    }},
    { "$group": {
        "_id": {
            "$cond": [
                { "$lt": [ "$date", fifteenDays ] },
                "16-30",
                { "$cond": [
                    { "$lt": [ "$date", sevenDays ] },
                    "08-15",
                    "01-07"
                ]}
            ]
        },
        "count": { "$sum": 1 },
        "totalValue": { "$sum": "$value" }
    }}
])

Como $cond es un operador ternario, la primera condición se evalúa para ver si la condición es verdadera y, cuando es verdadera, se devuelve el segundo argumento; de lo contrario, se devuelve el tercero cuando es falso. Entonces, al anidar otro $cond en el caso falso, obtiene la prueba lógica sobre dónde cae la fecha, ya sea "menos de la fecha de 15 días", lo que significa que está en el rango más antiguo, o "menos de 7 días", lo que significa el rango medio, o por supuesto está en la gama más nueva.

Solo estoy prefijando los números aquí menos de 10 con un 0 por lo que le da algo para clasificar si lo desea, ya que la salida de "claves" en $group no es en sí mismo ordenado.

Pero así es como se hace esto en una sola consulta. Simplemente averigüe cuál debe ser la clave de agrupación en función de dónde cae la fecha y se acumula para cada clave.