it-swarm.com.de

ausnahme: Konvertierung vom BSON-Typ EOO nach Datum nicht möglich

Ich erhalte ein Problem beim Ausführen der folgenden Aggregatabfrage:

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

Die Fehlermeldung für das gleiche ist:

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

Wie kann ich dieses Problem umgehen? Ich habe eine verwandte Frage gefunden

Zugehörige Stack Overflow-Frage

Aber es sagt nicht, wie man Dinge erledigt.

25
jsbisht

Sie haben wahrscheinlich ein oder mehrere Dokumente mit einem created_at-Wert, der keine BSON-Date ist. Sie müssen dies beheben, indem Sie diese Werte in Date konvertieren oder entfernen.

Sie finden diese Dokumente mit einer $not-Abfrage, die den Operator $type verwendet, wie folgt:

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

Wenn die created_at-Werte Datumszeichenfolgen sind, können Sie die zu aktualisierenden Dokumente suchen und sie in der Shell mit folgendem Code aktualisieren:

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

In einigen Situationen sollten einige Dokumente leere Datumsfelder enthalten. In diesen Fällen können Sie dies anhand Ihres Beispiels versuchen:

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

In diesem Beispiel würden wir -1 erhalten, wenn kein Feld "$ created_at" gefunden wird. Für alle anderen Fälle würden wir den Datumsmonat erhalten.

4
FRocha

Ich hatte ein verwandtes Problem, aber in meinem Fall waren die Datumsfelder die Mitglieder eines Arrays, daher war der Fehler "BSON-Typ Object in Date nicht konvertieren".

Ich musste den Wochentag von den Datumsangaben im Array "PossibleTripDateTimes" abrufen.

Beispieldokument:

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

Das Update bestand einfach darin, Punktnotation zu verwenden, um die Felder der Arraymitglieder zu adressieren.

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

Ich hoffe, das hilft jemandem, der bei der Suche nach "BSON-Typobjekt" auch null Suchergebnisse erhält

2
Skipwave

probiere dieses hier aus, seine Hilfe ist für mich das Problem.

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

der Code oben wird monatlich angezeigt

die Daten werden im ISO-Format in die Datenbank eingegeben und können dann problemlos bearbeitet werden. 

1
Anurag Pandey

Ich hatte ein ähnliches Problem und konnte es überprüfen, ob das Datum vorhanden war.

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

Mein Datumsfeld ist bd und damit bekomme ich alle Benutzer, die am 15. Januar Geburtstag haben.

1
facumedica

Dieser Fehler kann auch angezeigt werden, wenn Sie Ihre Eigenschaften in Ihrer Aggregation falsch benannt haben, und zwar in Bezug auf den Inhalt Ihrer Datenbank. 

Zum Beispiel war mein Code

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

Ich hatte jedoch keinen Zeitstempel in meiner Datenbank, also änderte er einfach den Code von projects.timestamp

0
Enda Molloy

Ich hatte das gleiche Problem und stellte fest, dass das Datumsfeld für einige der Dokumente fehlt, wodurch die Konvertierung fehlgeschlagen ist. Ich habe nur eine Übereinstimmungsklausel hinzugefügt, um diese herauszufiltern. Aber natürlich untersuche ich auf meiner App-Seite, warum sie nicht besiedelt sind.

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

Zuerst müssen Sie prüfen, ob der Datentyp in ISODate ist. WENN Sie den Datentyp nicht wie im folgenden Beispiel ändern können.

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

Jetzt können Sie es auf zwei Arten finden

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

Oder durch Aggregation

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}}])
0
ABDUL JAMAL