8

集計関数を使用して、日付フィールドを年ごとにグループ化しようとしています:

db.identities.aggregate([
{
    $group : {
        _id : { year : {$year : "$birth_date"}},
        total : {$sum : 1}
        }
    }   
])

ただし、私の日付の一部は 1970 年より前であり、Windows ユーザーであるため、gmtime に関する厄介なエラーが発生します。

{
    "errmsg" : "exception: gmtime failed - your system doesn't support dates before 1970",
    "code" : 16422,
    "ok" : 0
}

明らかな答えは、仮想マシンを実行するか何かであることがわかっていますが、Windows(私の場合はWindows 7)の回避策があるかどうかに興味がありました。ネストされたオブジェクトとして日付を保存すると、どの程度のパフォーマンスヒットが発生するかがわからない場合は、次のようになります。

birth_date : {
  year : 1980,
  month : 12,
  day : 9
}

インデックスなどでどれだけ多忙になるかはよくわかりません。

アドバイスをいただければ幸いです。

4

2 に答える 2

1

一部のバージョンの Windows は動作することがわかっています。ひょっとして、32ビットOSをお使いですか?問題のコードはhereで、gmtime_s()実装によって異なります。

このコレクションが単に集計クエリ用である場合は、日付コンポーネントをオブジェクトに格納することで十分に対処できます。フィールド文字列は保存された各ドキュメントに存在するため、ストレージを節約するためにフィールド名を短縮することをお勧めします (例: ym、 )。dここでのトレードオフは、集計日付演算子を使用できないことです。ts必要に応じて範囲クエリを簡単に実行できるように、タイムスタンプを符号付き整数 (例: ) として保存することができます。

于 2012-12-19T21:58:40.517 に答える