一般に両方の形式が有効であり、ほとんどの言語実装ではミリ秒が実際に優先されるため、ミリ秒ではなく秒単位の値が必要だと思う理由がわかりません。しかし、一般的に言えば、これを文字列に強制しようとすることは、これを回避するための間違った方法であり、一般的には、数学を行うだけです:
db.data.aggregate([
{ "$project": {
"timestamp": {
"$subtract": [
{ "$divide": [
{ "$subtract": [ "$md", new Date("1970-01-01") ] },
1000
]},
{ "$mod": [
{ "$divide": [
{ "$subtract": [ "$md", new Date("1970-01-01") ] },
1000
]},
1
]}
]
}
}}
])
これは、エポックタイムスタンプを秒単位で返します。基本的に、あるBSON日付オブジェクトが別のオブジェクトから減算された場合から導出され、結果はミリ秒単位の時間間隔になります。 「1970-01-01」の初期エポック日付を使用すると、基本的に現在の日付値からミリ秒値が抽出されます。 $divide
演算子は基本的にミリ秒の部分と$mod
を削除します 丸めを実装するためにモジュロを実行します。
実際には、すべてのBSON日付が、タイムスタンプ値を抽出できるネイティブの「date / datetime」タイプとして返されるため、アプリケーションの母国語で作業を行う方が適切です。シェルのJavaScriptの基本を検討してください:
var date = new Date()
( date.valueOf() / 1000 ) - ( ( date.valueOf() / 1000 ) % 1 )
通常、集計では、1日のような期間内の値を集計するようなもので使用するために、タイムスタンプ値に対してこの種の「計算」を実行する必要があります。集計フレームワークで使用できる日付演算子がありますが、日付計算の方法で実行することもできます:
db.data.aggregate([
{ "$group": {
"_id": {
"$subtract": [
{ "$subtract": [ "$md", new Date("1970-01-01") ] },
{ "$mod": [
{ "$subtract": [ "$md", new Date("1970-01-01") ] },
1000 * 60 * 60 * 24
]}
]
},
"count": { "$sum": 1 }
}}
])
この形式は、1日に丸められたタイムスタンプを発行し、それらの間隔内で結果を集計するのが一般的です。
したがって、タイムスタンプを抽出するためだけに集計フレームワークを使用するのは最善の方法ではないようです。実際、これをミリ秒ではなく秒に変換する必要はありません。もちろん、示されているように日付計算を適用できる時間間隔の結果が実際に必要な場合を除いて、アプリケーションコードではそれを実行する必要があると思います。
メソッドはありますが、実際に集約しない限り、これはアプリケーションにとって最悪のパフォーマンスオプションになります。代わりにコードで変換を行ってください。