Me estoy haciendo un tema para la ejecución de los siguientes agregados de consulta:

db.snippets.aggregate([ { '$project': { month: { '$month': '$created_at' }} } ])

El mensaje de error de la misma es:

assert: command failed: {
        "errmsg" : "exception: can't convert from BSON type EOO to Date",
        "code" : 16006,
        "ok" : 0 } : aggregate failed

¿Cómo puedo conseguir alrededor de este problema. He encontrado una pregunta relacionada con la

Relacionados con el Desbordamiento de la Pila pregunta

Pero no dicen cómo hacer las cosas.

  • En caso de que alguien tierras aquí en busca de lo contrario, por ejemplo. todos los documentos han milisegundos en el campo de la fecha, echa un vistazo a: stackoverflow.com/questions/29892152/…
InformationsquelleAutor jsbisht | 2015-02-09

8 Comentarios

  1. 57

    Es probable que tenga uno o más documentos con un created_at valor que no es un HIJO Date y tendrás que solucionarlo mediante la conversión de los valores de Date o la eliminación de ellos.

    Usted puede encontrar los docs con una $not consulta que utiliza la type operador como:

    db.snippets.find({created_at: {$not: {$type: 9}}})

    Si el created_at valores son las cadenas de fecha, puede encontrar la documentación que hay que actualizar y, a continuación, actualice en la shell mediante un código como:

    db.snippets.find({created_at: {$not: {$type: 9}}}).forEach(function(doc) {
        //Convert created_at to a Date 
        doc.created_at = new Date(doc.created_at);
        db.snippets.save(doc);
    })
    • Usted ha hecho mi día el hombre. Yo estaba atascado debido a esto durante bastante tiempo.
    • No esta consulta sólo tienes que encontrar los documentos que no tienen un HIJO de la fecha? ¿Cómo puedo encontrar y actualizar todos los no-HIJO fechas?
    • extrapolar .find(conditions) en .update(conditions, update)
    • Ver respuesta actualizada.
    • Gracias. Hizo que mi día.
  2. 4

    En algunas situaciones, algunos documentos se supone que se han de vaciar los campos de Fecha. En esos casos, usted podría tratar este (utilizando tu ejemplo):

    db.snippets.aggregate([ { '$project': { month:  
     { $cond: [{ $ifNull: ['$created_at', 0] }, { $month: '$created_at' }, -1] }} } ])

    En este ejemplo, podemos obtener -1 en los casos cuando no hay campo ‘$created_at » se encuentra. Para todos los otros casos, podríamos obtener la Fecha del mes.

  3. 2

    Tuve un problema relacionado, pero en mi caso los campos de Fecha fueron los miembros de una matriz, por lo que el error fue «no se puede convertir el BHIJO del tipo de Objeto a la Fecha».

    Que necesitaba para conseguir el día de la semana a partir de las fechas en la possibleTripDateTimes matriz.

    Documento de muestra:

    {
    "possibleTripDateTimes" : [
        {
            "tripDateTime" : ISODate("2015-08-01T06:00:00.000-0700")
        }
    ]
    }

    La solución era utilizar la notación de punto para abordar el miembro de la matriz campos.

    db.trips.aggregate([
      {
           $project: {
             departTime: {
               $map: {
                 input: "$possibleTripDateTimes.tripDateTime",
                 as: "dateTime",
                 in: { $dayOfWeek: "$$dateTime" }
               }
       }
      }
    }
    ]
    );

    Espero que esto ayude a alguien que también se pone a cero los resultados de búsqueda en el «HIJO de Objeto de tipo» búsqueda

    • Ahh!! Esto es tan fresco. Usted me salvó un montón de estúpidos buscar horas! Gracias man 🙂
  4. 1

    probar este, su ayuda para mí el problema anterior.

    db.snippets.aggregate([{
    '$project': {
        month: { $substr: ["$created_at", 5, 2] }
    }
     }]);

    código anterior se obtiene mes sabio

    los datos se introducen en la base de datos en formato ISO que luego pueden ser fácilmente trabajado.

  5. 1

    Tuve el mismo problema, pensé que el campo de fecha es que faltan algunos de los documentos causando el error en la conversión. Me acaba de agregar un partido cláusula de filtro de estos. Pero por supuesto estoy investigando en mi app lado ¿por qué no se están pobladas.

    db.snippets.aggregate([
      {
        '$match': {
          'created_at': {
            "$exists": true
          }
        }
      },
      {
        '$project': {
          month: {
            '$month': '$created_at'
          }
        }
      }
    ])
  6. 1

    He tenido un problema similar, y la resolvió la comprobación de si la fecha existían.

    db.users.aggregate([
    {$project:{day:  { $cond: ["$bd", { $dayOfMonth: "$bd" }, -1] },
               month:  { $cond: ["$bd", { $month: "$bd" }, -1] },
               year:  { $cond: ["$bd", { $year: "$bd" }, -1] }
               }},
    {$match:{"month":1, "day":15}}
    ])

    Mi campo de fecha es bd y con el partido, estoy consiguiendo todos los usuarios que tienen su cumpleaños el 15 de enero.

  7. 0

    Este error también puede aparecer si usted tiene mal llamados sus propiedades en su agregación en relación a lo que están en su base de datos.

    Por ejemplo, mi código era

    $group: {
            _id: {$week: "$projects.timeStamp"},
            total: { $sum: "$projects.hours"  }
        }

    Pero yo no había en formato camelcase hora en mi base de datos, así que simplemente modificando a projects.timestamp fija.

  8. 0

    Primer lugar, usted necesita para comprobar si el tipo de datos es en ISODate. SI no puede cambiar el tipo de datos como en el ejemplo siguiente.

    db.collectionName.find().forEach(function(each_object_from_collection){each_object_from_collection.your_date_field=new ISODate(each_object_from_collection.your_date_field);db.collectionName.save(each_object_from_collection);})

    Ahora se puede encontrar en dos formas

    db.collectionName.find({ $expr: {$eq: [{ $year: "$your_date_field" }, 2017]}});

    O por la agregación

    db.collectionName.aggregate([{$project: {field1_you_need_in_result: 1,field12_you_need_in_result: 1,your_year_variable: {$year: '$your_date_field'}, your_month_variable: {$month: '$your_date_field'}}},{$match: {your_year_variable:2017, your_month_variable: 3}}])

Dejar respuesta

Please enter your comment!
Please enter your name here