Исключение: невозможно преобразовать из BSON типа EOO в Date
У меня возникла проблема при запуске следующего сводного запроса:
db.snippets.aggregate([ { '$project': { month: { '$month': '$created_at' }} } ])
Сообщение об ошибке для этого же:
assert: command failed: {
"errmsg" : "exception: can't convert from BSON type EOO to Date",
"code" : 16006,
"ok" : 0 } : aggregate failed
Как мне обойти эту проблему. Я нашел связанный вопрос
Связанный вопрос о переполнении стека
Но он не говорит, как это сделать.
Ответы
Ответ 1
Вероятно, у вас есть один или несколько документов со значением created_at
, а не BSON Date
, и вам нужно будет исправить это путем преобразования этих значений в Date
или их удаления.
Вы можете найти эти документы с запросом $not
, который использует оператор $type
, например:
db.snippets.find({created_at: {$not: {$type: 9}}})
Если значения created_at
являются строками даты, вы можете найти документы, которые нуждаются в обновлении, а затем обновить их в оболочке, используя следующий код:
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);
})
Ответ 2
В некоторых ситуациях некоторые документы должны иметь пустые поля Date. В таких случаях вы можете попробовать это (используя ваш пример):
db.snippets.aggregate([ { '$project': { month:
{ $cond: [{ $ifNull: ['$created_at', 0] }, { $month: '$created_at' }, -1] }} } ])
В этом примере мы получим -1 в случаях, когда не будет найдено поля '$ created_at'. Для всех остальных случаев мы получили месяц с датой.
Ответ 3
У меня была связанная с этим проблема, но в моем случае поля Date были членами массива, поэтому ошибка была "не может преобразовать тип объекта BSON в Date".
Мне нужно было получить день недели из дат в массиве possibleTripDateTimes.
Пример документа:
{
"possibleTripDateTimes" : [
{
"tripDateTime" : ISODate("2015-08-01T06:00:00.000-0700")
}
]
}
Исправление было просто использовать точечную нотацию для обращения к полям элементов массива.
db.trips.aggregate([
{
$project: {
departTime: {
$map: {
input: "$possibleTripDateTimes.tripDateTime",
as: "dateTime",
in: { $dayOfWeek: "$$dateTime" }
}
}
}
}
]
);
Я надеюсь, что это поможет кому-то, кто также получает нулевые результаты поиска в поиске объекта типа BSON
Ответ 4
попробуйте это, его помощь для меня выше проблемы.
db.snippets.aggregate([{
'$project': {
month: { $substr: ["$created_at", 5, 2] }
}
}]);
выше код получить месяц мудрым
данные вводятся в базу данных в формате ISO, с которыми можно легко работать.
Ответ 5
У меня была аналогичная проблема, и я решил проверить, существовала ли дата.
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}}
])
Мое поле даты bd
, и с этим совпадением я получаю всех пользователей, у которых есть свой день рождения 1 января.
Ответ 6
У меня была такая же проблема, я подумал, что поле даты отсутствует для некоторых документов, что приводит к сбою преобразования. Я просто добавил условие соответствия, чтобы отфильтровать их. Но, конечно, я изучаю на стороне своего приложения, почему они не заселены.
db.snippets.aggregate([
{
'$match': {
'created_at': {
"$exists": true
}
}
},
{
'$project': {
month: {
'$month': '$created_at'
}
}
}
])
Ответ 7
Эта ошибка также может появиться, если вы неправильно указали свои свойства в своей совокупности относительно того, что они находятся в вашей базе данных.
Например, мой код был
$group: {
_id: {$week: "$projects.timeStamp"},
total: { $sum: "$projects.hours" }
}
Но в моей базе данных я не привязывался к Camelcased timestamp, поэтому просто изменил ее на projects.timestamp
.