Подтвердить что ты не робот

Исключение: невозможно преобразовать из 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

Как мне обойти эту проблему. Я нашел связанный вопрос

Связанный вопрос о переполнении стека

Но он не говорит, как это сделать.

4b9b3361

Ответ 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.