2016-01-08 4 views
0

Пример документа в MongoDB:MongoDB агрегация NumberLong Дата съемки

{ 
    "_id" : ObjectId("512eef329d5d0c9415000025"), 
    "time" : NumberLong(1431973102) 
} 

Я хочу, чтобы получить $ DayOfMonth из значения временной метки, сохраненного в атрибуте времени в aggreate запросе но у меня это excepcion сообщение:

uncaught exception: aggreate failed: { 
    "errmsg" : "exception: can't convert from BSON type NumberLong64 to Date", 
    "code" : 16006, 
    "ok" : 0 
} 

Когда я запускаю этот запрос:

db.getCollection('collection_name').aggregate([ 
{ $match: { '_id': ObjectId('512eef329d5d0c9415000025') } }, 
{ $project: { 'time': 1, "dayOfMonth": { $dayOfMonth: '$time' } } } 
]) 

Любая идея? Спасибо.

ответ

0

Если вы используете Java, я бы предложил вам использовать библиотеку Joda-Time для преобразования даты в эпоху и выделения требуемого месяца.

DateTime date = new DateTime(dateInMilli); 
date.dayOfMonth(); 

Если дата не используется в любом месте приложения, то вы могли бы, а также сохранить его в формате ISODate вместо Эпохи.

Если вы используете JS, то ссылка, предоставленная JohnnyHK, содержит больше информации.

1

Ваша первая необходимость преобразовать Unix эпохи к ISODate с помощью $add

db.data.aggregate({ 
    $project: { 
    "dayOfMonth": { 
     $dayOfMonth: { 
     $add: [new Date("1970-01-01"), { 
      $multiply: ["$time", 1000] 
     }] 
     } 
    } 
    } 
}) 

Реализация этого к вашему запросу дает:

db.data.aggregate([ 
{$match: { '_id': ObjectId('512eef329d5d0c9415000025') } }, 
{$project: {"time": 1,"dayOfMonth": {$dayOfMonth: {$add: [new Date("1970-01-01"), {$multiply: ["$time", 1000]}]}}}}])