2013-04-24 3 views
9

Я пытаюсь использовать структуру агрегации (с рубином) и спроецировать дату, как это:MongoDB: не может преобразовать из типа BSON его к дате

db['requests'].aggregate([ 
{"$project" => { 
    _id: 0, 
    method: '$method', 
    user: '$user', 
    year: {'$year' => '$timestamp'} 
}}]) 

документ как этот:

{ 
_id: ObjectId("5177d7d7df26358289da7dfd"), 
timestamp: ISODate("2013-04-12T03:58:05+00:00"), 
method: "POST", 
status: "200", 
inputsize: "874", 
outputsize: "4981", 
user: "131" 
} 

, но я получаю следующее сообщение об ошибке:

Mongo::OperationFailure: Database command 'aggregate' failed: (errmsg: 'exception: can't convert from BSON type EOO to Date'; code: '16006'; ok: '0.0'). 

Это странно, потому что он работает правильно, если я бегу это на точно той же БД, которые я s импортировано с mongorestore.

+0

Очевидно, что порядок массива, переданный в aggregate(), важен. Если у вас есть поля, в которых что-то пропущено, вам нужно добавить это в соответствие $ и иметь совпадение $ - первый элемент в массиве. То есть > db.user_account.aggregate ([{$ match: {"uts": {$ exists: true}, "chan_key": "333261c7a72650a95c68d30cd70"}}, {$ project: {"period_month": {$ month: "$ uts "}}}, {$ group: {_id: {" period_month ":" $ period_month "}," number ": {$ sum: 1}}}]) –

ответ

20

Проблема заключалась в том, что я сохранял некоторые документы без поля timestamp.

+0

Yup! Я тоже. Я выполнил поиск документов, где моя метка времени была «ноль», и был только один документ. Я исправил это, и вуаля! запрос работает. –

+1

Можете ли вы привести пример того, как вы нашли такие документы. – jsbisht

2

Если вам необходимо иметь некоторые документы без этого поля метки времени, вы могли бы попробовать это (я использую Javascript/Mongoose обозначение):

year: { $cond: [{ $ifNull: ['$timestamp', 0] }, { $year: '$deliveryDateEnd' }, -1] } 

В этом случае каждый документ без поля метки времени вернется -1. Все остальные документы вернут год, как ожидалось.

Смежные вопросы