私のコレクションの1つでは、isodateではなくunixタイムスタンプのままにする必要がありますが、通常、タイムスタンプを新しい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')
そして今、solution(php 5.4構文):
$so->aggregate([
['$project' => ["date" => ['$substr' => [new MongoDate(), 0, -1]] ] ]
]);
開始Mongo 4.0
、これは $toDate
集計演算子:
// { "ts": 1400512120100 }
db.collection.aggregate({ $project: { date: { $toDate: "$ts" } } })
// { "date": ISODate("2014-05-19T15:08:40.100Z") }