2015-02-09 9 views
25

jestem coraz problem z uruchomieniem następującą kwerendę Łącznie:wyjątek: nie można przekonwertować z typu BSON EoO to Date

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

Komunikat o błędzie na to samo:

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

Jak mogę obejść ten problem. Znalazłem powiązane pytanie

Related Stack Overflow question

Ale to nie robi powiedzieć jak dostać rzeczy zrobić.

+0

Na wypadek, gdyby ktoś wylądował tutaj szukając czegoś przeciwnego, np. wszystkie dokumenty mają milisekundy w polu daty, spójrz na: http://stackoverflow.com/questions/29892152/convert-miliseconds-to-date-in-mongodb-aggregation-pipeline-for-group-by – Wtower

Odpowiedz

46

Prawdopodobnie mieć jeden lub więcej dokumenty z created_at wartości, która nie jest BSON Date i trzeba to naprawić poprzez przekształcenie tych wartości do Date lub usuwając je.

można znaleźć te dokumenty z $not kwerendy, która używa operatora $type jak:

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

Jeśli wartości created_at są łańcuchach daty, można znaleźć dokumenty, które wymagają aktualizacji, a następnie zaktualizować je w powłoka używająca kodu takiego jak:

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

Zrobiłeś mój dzień mężczyzna. Utknąłem z tego powodu od dłuższego czasu. – jsbisht

+0

@JohnnyHK Czy to zapytanie nie znalazłoby dokumentów, które nie mają daty BSON? Jak mogę znaleźć i zaktualizować wszystkie daty inne niż BSON? – user137717

+1

@ user137717 ekstrapoluj '.find (warunki)' do '.update (warunki, aktualizacja)' – bloudermilk

4

W niektórych sytuacjach niektóre dokumenty powinny mieć puste pola Data. W tych przypadkach można spróbować to (za pomocą przykładu):

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

W tym przykładzie chcemy uzyskać -1 w przypadkach, gdy nie pole „$ created_at” został znaleziony. We wszystkich pozostałych przypadkach otrzymamy miesiąc Data.

1

wypróbuj ten, jego pomoc dla mnie powyżej problemu.

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

Powyższy kod get miesiąc mądry

dane są wprowadzane do bazy danych w formacie ISO, które następnie mogą być łatwo pracował.

2

Miałem powiązany problem, ale w moim przypadku pola Data były członkami tablicy, więc błąd był "nie można przekonwertować obiektu typu BSON na datę".

Potrzebowałem uzyskać dzień tygodnia z dat w możliwej tablicyTripDateTimes.

dokument próbki:

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

Rozwiązaniem było po prostu użyć notacji dot zająć pola członków tablicą.

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

Mam nadzieję, że to pomoże ktoś, kto dostaje również zerowe wyniki wyszukiwania na „BSON typu Object” szukaj

+0

Ahh !! To jest takie fajne. Uratowałeś mi wiele głupich godzin poszukiwań! Dzięki :) –

0

miałem podobny problem i go rozwiązał sprawdzenie czy data istniał.

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

Moja data pole jest bd i z tego meczu Dostaję wszystkich użytkowników, którzy mają swoje urodziny w dniu 1 stycznia.

0

Miałem ten sam problem, doszedłem do wniosku, że w niektórych dokumentach powodujących niepowodzenie konwersji brakuje pola daty. Właśnie dodałem klauzulę dopasowania, aby je odfiltrować. Ale oczywiście badam na mojej stronie aplikacji, dlaczego nie są one zamieszkiwane.

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

Ten błąd może się również pojawić, jeśli niepoprawnie nazwałeś swoje właściwości w swojej agregacji w stosunku do ich zawartości w bazie danych.

Na przykład mój kod był

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

Ale ja nie camelCased znacznik czasu w mojej bazy danych tak prostą modyfikację do projects.timestamp naprawił.

Powiązane problemy