новая дата() в совокупном $ проекте

Для одной из моих коллекций, которая должна оставаться временной отметкой unix вместо isodate, я обычно конвертирую метку времени с новой Date (unix_timestamp).

Теперь мне нужно new Date(ts) в агрегации. (пример находится в PHP)

'$ project' = > array ('day' = > '$ new Date (ts)',...

'$ group' = > array ( "_id" = > array ('day' = > '$ day)',...),...

не приходит в результаты. Поле "день" в результате полностью отсутствует.

Как это преобразовать в агрегацию?

Ответы

Ответ 1

чтобы иметь возможность добавить поле метки из документа, вы можете сделать это, учитывая:

{"ts": 1400512120100}

для агрегирования как даты:

db.foo.aggregate({
   $project: {
       date: { $add: [new Date(0), "$ts"] }
   }
})

Ответ 2

Для дополнительных вычисленных полей в проекции вам нужно использовать оператор $add, например: (пример консоли)

db.so.aggregate([{$project: {date: {$add: Date() }}}])

но это неправильно, и мы получаем сообщение об ошибке:

exception: $add does not support strings (or dates)

Но я нашел простой хак =)

db.so.aggregate([{$project: {date: {$substr: [Date(), 0, -1] }}}])

В этом случае мы ожидаем результата с датами Кроме того, в выводе PHP вы можете увидеть такую ​​ошибку:

exception: disallowed field type Date in object expression (at 'date')

И теперь, решение (синтаксис php 5.4):

$so->aggregate([
    ['$project' => ["date" => ['$substr' => [new MongoDate(), 0, -1]] ] ]
]);

Ответ 3

Начиная с Mongo 4.0, этого можно достичь с $toDate оператора агрегации $toDate:

// { "ts": 1400512120100 }
db.collection.aggregate({ $project: { date: { $toDate: "$ts" } } })
// { "date": ISODate("2014-05-19T15:08:40.100Z") }