Ответ 1
чтобы иметь возможность добавить поле метки из документа, вы можете сделать это, учитывая:
{"ts": 1400512120100}
для агрегирования как даты:
db.foo.aggregate({
$project: {
date: { $add: [new Date(0), "$ts"] }
}
})
Для одной из моих коллекций, которая должна оставаться временной отметкой unix вместо isodate, я обычно конвертирую метку времени с новой Date (unix_timestamp).
Теперь мне нужно new Date(ts)
в агрегации. (пример находится в PHP)
'$ project' = > array ('day' = > '$ new Date (ts)',...
'$ group' = > array ( "_id" = > array ('day' = > '$ day)',...),...
не приходит в результаты. Поле "день" в результате полностью отсутствует.
Как это преобразовать в агрегацию?
чтобы иметь возможность добавить поле метки из документа, вы можете сделать это, учитывая:
{"ts": 1400512120100}
для агрегирования как даты:
db.foo.aggregate({
$project: {
date: { $add: [new Date(0), "$ts"] }
}
})
Для дополнительных вычисленных полей в проекции вам нужно использовать оператор $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]] ] ]
]);
Начиная с Mongo 4.0
, этого можно достичь с $toDate
оператора агрегации $toDate
:
// { "ts": 1400512120100 }
db.collection.aggregate({ $project: { date: { $toDate: "$ts" } } })
// { "date": ISODate("2014-05-19T15:08:40.100Z") }