2012-12-16 28 views
8

によって私は年によってグループ日付フィールドに、集計関数を使用しようとしてきた:MongoDBの集計フレームワーク - グループ年

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

私の日付の一部が1970年前に落ちると私はウィンドウズユーザーであること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 
} 

私はなど

感謝何かアドバイスを指標とされることをどのように多忙すぎてわかりません!

+0

あなたはどのバージョンのMongoを使用していますか? – Alex

答えて

0

一部のバージョンのWindowsは動作することが知られています。万が一、32ビットOSを使用していますか?問題のコードはhereであり、gmtime_s()の実装に依存します。

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

+0

長い遅延のためにお詫び - ちょうどこの1つを再訪問しました。ご回答有難うございます! – backdesk

+0

これは、このプラットフォーム上の 'date type'実装を真剣に犠牲にしているので、やや悪質なものです。これは64ビットビルドでも発生します:http://stackoverflow.com/q/21869602/2313887 –

+0

@NeilLunn:他の質問であなたのコメントを書き、[SERVER-12816](https://jira.mongodb .org/browse/SERVER-12816)を使用してこれを追跡します。 – jmikola

関連する問題