eccezione: imansible convertire da BSON tipo EOO a Data

Ricevo un problema per l’esecuzione della seguente query aggregata:

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

Il messaggio di errore per lo stesso è:

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

Come faccio a risolvere questo problema. Ho trovato una domanda correlata

Stack overflow relativo

Ma non dice come fare le cose.

Probabilmente hai uno o più documenti con un valore created_at che non è una Date BSON e dovrai correggerlo convertendoli in Date o rimuovendoli.

Puoi trovare quei documenti con una query $not che utilizza l’operatore $type come:

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

Se i valori created_at sono stringhe di date, puoi trovare i documenti che devono essere aggiornati e quindi aggiornarli nella shell usando un codice come:

 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); }) 

In alcune situazioni, alcuni documenti dovrebbero avere campi Data vuoti. In questi casi, puoi provare questo (usando il tuo esempio):

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

In questo esempio, otterremmo -1 nei casi in cui non viene trovato alcun campo ‘$ created_at’. Per tutti gli altri casi, otterremmo il mese della data.

Avevo un problema correlato, ma nel mio caso i campi Data erano i membri di un array, quindi l’errore era “imansible convertire BSON type Object to Date”.

Avevo bisogno di ottenere il giorno della settimana dalle date nella matrice ansible DateDateTimes.

Documento di esempio:

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

La correzione consisteva semplicemente nell’uso della notazione a punti per indirizzare i campi dei membri dell’array.

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

Spero che questo aiuti qualcuno che ottiene anche risultati di ricerca pari a zero nella ricerca “Oggetto di tipo BSON”

prova questo, il suo aiuto per me sopra il problema.

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

il codice sopra viene considerato saggio

i dati vengono inseriti nel database in formato ISO che può essere facilmente lavorato con.

Ho avuto un problema simile e ho risolto il problema verificando se esistesse la data.

 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}} ]) 

Il mio campo data è bd e con quella partita ricevo tutti gli utenti che hanno il loro compleanno il 15 gennaio.

Ho avuto lo stesso problema, ho pensato che mancasse il campo data per alcuni dei documenti che hanno causato il fallimento della conversione. Ho appena aggiunto una clausola match per filtrarli. Ma naturalmente sto indagando sul mio lato app perché non vengono popolati.

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

Questo errore può anche apparire se hai erroneamente chiamato le tue proprietà nella tua aggregazione rispetto a ciò che sono nel tuo database.

Ad esempio il mio codice era

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

Ma non avevo il timestamp di un camelbox nel mio database, quindi la semplice modifica a projects.timestamp corretto.

Innanzitutto, è necessario verificare se il tipo di dati è in ISODate. SE non è ansible modificare il tipo di dati come nell’esempio seguente.

 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);}) 

Ora puoi trovarlo in due modi

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

O per aggregazione

 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}}])