web-dev-qa-db-ja.com

合計$ projectの新しいDate()

私のコレクションの1つでは、isodateではなくunixタイムスタンプのままにする必要がありますが、通常、タイムスタンプを新しいDate(unix_timestamp)に変換します。

ここで、集約にnew Date(ts)が必要です。 (例はPHPです)

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

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

結果には届きません。結果の「日」フィールドが完全に欠落しています。

これをアグリゲーション内で変換するにはどうすればよいですか?

18
ledy

ドキュメントからタイムスタンプフィールドを追加できるようにするには、次のように指定します。

{"ts": 1400512120100}

日付として集計するには:

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

プロジェクションの追加の計算フィールドには、次のような$ 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]] ] ]
]);
3
Kirill Zorin

開始Mongo 4.0、これは $toDate 集計演算子:

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