web-dev-qa-db-ja.com

CouchDBに日時(タイムスタンプ)を保存するための最良の方法は何ですか?

2011-01-26 21:41:09 +0000のようなUTC時間文字列は、ビューキーで使用されている場合は正しく並べ替えられるので問題ないと思いますが、タイムゾーン(例:2011-01-26 16:41:09 -0500)を保存すると、ドキュメントが読みやすくなります。日付をエポック整数に変換することは、読みやすさの観点からは最も魅力的ではないように見えますが、パフォーマンスにはおそらく最適です(または違いがありますか?)。ここで推奨される方法は何ですか?

26
dan

時間は一次元のものです。タイムスタンプとタイムゾーンは2次元であり、特定の時点と場所を表します。 Couchビューは1次元(GeoCouchプラグインではない)であるため、共通ゾーン(UTC)に保存するのが賢明です。

おそらく最も将来性のある形式は、時系列で自然にソートされる文字列です。おそらく最も便利なそのようなフォーマットは、JSON2が出力するものです。

> a = new Date();
Thu Jan 27 2011 18:40:52 GMT+0700 (ICT)
> JSON.stringify(a)
"2011-01-27T11:40:52.280Z"
33
JasonSmith

Map reduceのマップ側だけを使用している場合は、これらの提案でおそらく問題ありません。ただし、結果(_count、_stats、_sum)を減らしたい場合は、group_levelを使用できるように、日付を配列として出力することをお勧めします。

たとえば、「2011-02-14」のような形式の日付文字列で(doc.date.split( '-'))を発行すると、 group_level = 3、2、および1それぞれ。

キーの先頭に日付以外のデータを追加することで、データをさらにフィルタリングできます。たとえば、Twitter名を出力する場合、キーは["bigbluehat"、 "2011"、 "02"、 "14"]のようになり、reduceはユーザー "bigbluehat"のすべてのツイートの総数を次のように返すことができます。また、そのユーザーの日、月、年の統計も表示されます。

物事のreduce側を使用していない場合は、文字列ベースのキーで問題ない可能性があります。

6
BigBlueHat

使用するデータストレージの種類に関係なく、通常、フィールドとしてUNIXタイムスタンプが必要です。このフィールドには、作成日用のUNIXタイムスタンプと、ドキュメントの変更時に変更できる更新フィールドが含まれます。

私は、単に簡潔にするために、「エポックからのミリ秒」よりも、通常の「エポックからの秒数」のアプローチを好みます。

Math.round(new Date().getTime()/1000)は私のためにトリックを行います。

読みやすさの観点から、比較しやすいように整数として格納し、フロントエンドを使用して見栄えよく表示したいと思います。

5
Kristian

前回のエポックからミリ秒を使用するのが好きです。あなたはこれを理解することができます:

new Date().valueOf()

次のコマンドを使用して、ミリ秒から新しい日付を作成できます。

var milliseconds = new Date().valueOf();
var date = new Date(milliseconds);

タイムスタンプ(ミリ秒単位)が重要なビューを作成するのが好きです。b/ cの並べ替えは非常に簡単です。

また、少なくともCouchDBの外部のデータを操作する場合は、整数を使用する方が文字列よりも効率的だと思います。

4
Teddy

日付は好きなように保存できます*。重要なのは、日付をビューに出力する方法です。

* Date.parse()がそれを読み取ることができる限り。

ここに良い解決策があります: CouchDBビューでの日付のソート

4
geoffreyd