aquí es la consulta

[
    { 
        "$project": {
            "formattedDate": { 
                "$dateToString": { "format": "%Y-%m-%d", "date": "$ceatedAt" } 
            },
            "createdAtMonth": { "$month": "$ceatedAt" },
            "rating": 1
        }
    },
    {
         "$group": {
             "_id": "$formattedDate",
             "average": { "$avg": "$rating" },
             "month": { "$first": "$createdAtMonth" },
         }
    }
]

Necesito la fecha en la marca de tiempo. Cómo hacer que?

InformationsquelleAutor nirvair | 2016-09-01

2 Comentarios

  1. 11

    Uso $restar aritméticos operador de agregación con su Fecha, como minuendo y new Date("1970-01-01") como sustraendo.

    db.collection.aggregate(
      {
        $project: { "timestamp": { $subtract: [ "$createdAt", new Date("1970-01-01") ] } } 
      }
    );

    Documento

    { "_id": 1, "createdAt": ISODate("2016-09-01T14:35:14.952Z") }

    el resultado es

    { "_id": 1, "timestamp": NumberLong("1472740514952") }

    Si quieres grupo, tanto por la fecha y el (año, mes, día) puede dividir marca de tiempo por la cantidad de milisegundos en un día, así que será único para cada día (y no para cada milisegundo)

    db.collection.aggregate(
      {
        $project: 
          {
            "timestampByDay":
              {
                $floor: 
                  {
                    $divide: 
                      [ 
                        { $subtract: [ "$createdAt", new Date("1970-01-01") ] }, 
                        24 * 60 * 60 * 1000 
                      ] 
                  }
              },
            "date": "$createdAt"
          }
      },
      {
        $group:
          {
            "_id": "$timestampByDay",
            "date": { $first: "$date" }
          }
      }
    );
    • Pero, ¿voy a tener los datos agrupados para esa fecha?
    • No si desea agrupar el valor de (año, mes, día). Podría proporcionar algunos documentos y resultado esperado en tu pregunta?
    • Sí, en la entrada de la solicitud voy a agrupar por mes, semana, día. He aquí la respuesta que me dieron para el mes y de semana funciona: stackoverflow.com/questions/39269760/… Ahora, cuando el grupo por día, necesito mostrar la marca de tiempo y no de la fecha de la cadena.
    • En el grupo, le tengo que agregar _id: timestampByDay ?
    • Sí, que serán agrupados con (año, mes, día), el ser único. Pero tenga en cuenta que en el resultado de la salida de no obtener el timestamp de la Fecha como _id, pero usted conseguirá marca de tiempo dividido por 24 * 60 * 60 * 1000.
    • Me estoy poniendo esto en timestampByDay – 17023.4279265625. ¿Qué implica esto? Y no me da los datos agrupados. Podría usted amablemente también añadir cómo obtener los datos agrupados. Puede ser sólo por el día.
    • Sí, lo siento, se me olvidó añadir $floor operador. Actualizada la respuesta. Ahora debe ser 17023, y en su caso se implica de un día único identificador, el número de día, después de 1970-01-01.
    • Y si tengo que convertir 17023 de vuelta a la normalidad de la fecha en front-end, será posible?
    • Será mucho más fácil para no convertir de 17023, sino simplemente para añadir a su $project etapa y, a continuación, utilizar $first operador a como se hizo para el mes.
    • Puede usted por favor proporcione en respuesta?
    • He actualizado la respuesta. Si usted necesita otro resultado, sería mucho más fácil si usted actualizar tu pregunta con las expectativas de uno.

  2. 10

    Mongodb 4.0 ha introducido $toLong de agregación, que convierten la fecha timestamp

    db.collection.aggregate([
      { "$project": {
        "createdAt": {
          "$toLong": "$createdAt"
        }
      }}
    ])

    Puedes probarlo aquí

Dejar respuesta

Please enter your comment!
Please enter your name here