2013-07-24 5 views
8

私はこのように格納された位置データと設定MongoDBのデータストアを有するの時間範囲の間に照会:私はdate range例と同様のクエリを実行できるようにしたいのMongoDB - 時間

{ 
"_id" : ObjectId("51d3e161ce87bb000792dc8d"), 
"datetime_recorded" : ISODate("2013-07-03T05:35:13Z"), 
"loc" : { 
    "coordinates" : [ 
     0.297716, 
     18.050614 
    ], 
    "type" : "Point" 
}, 
"vid" : "11111-22222-33333-44444" 
} 

しかし代わりに時間範囲にあります。即ち、12AMから4PMの間で記録された全てのポイントを検索する(1200と1600の24時間の時間でも行うことができる)。

ポイントを

  • "datetime_recorded" : ISODate("2013-05-01T12:35:13Z"),
  • "datetime_recorded" : ISODate("2013-06-20T05:35:13Z"),
  • "datetime_recorded" : ISODate("2013-01-17T07:35:13Z"),
  • "datetime_recorded" : ISODate("2013-04-03T15:35:13Z"),

クエリ

db.points.find({'datetime_recorded': { 
    $gte: Date(1200 hours), 
    $lt: Date(1600 hours)} 
}); 

は、最初と最後のポイントのみを返します。

これは可能ですか?それとも毎日それをしなくてはなりませんか?

+1

Mongodbには通常のクエリの日付/時刻演算子がないため、スキーマを変更して別のフィールドとして時間を含めることをお勧めします。それがなければ、索引を効率的に使用して結果を絞り込むことはできません。 – WiredPrairie

答えて

7

これを解決する最良の方法は、分を別に保存することです。しかし、あなたは、集約フレームワークでこの問題を回避することができるがですがは非常に高速であることを行っていない:

db.so.aggregate([ 
    { $project: { 
     loc: 1, 
     vid: 1, 
     datetime_recorded: 1, 
     minutes: { $add: [ 
      { $multiply: [ { $hour: '$datetime_recorded' }, 60 ] }, 
      { $minute: '$datetime_recorded' } 
     ] } 
    } }, 
    { $match: { 'minutes' : { $gte : 12 * 60, $lt : 16 * 60 } } } 
]); 

最初のステップ$projectでは、我々は2番目に照合hour * 60 + minから数分を計算しますステップ:$match

+0

あなたは正しいです - 速くない!それは仕事をします:-) Upvotedしかし、誰かがそれを行うより速い方法を提供できるかどうかを見に行くだけです。どうもありがとう! ちょっとしたpymongoスクリプトを使って、1時間ごとに別々にループを更新するかもしれません... – Ewan

+0

答えました - 小さなデータセットで作業していますが、分/時間フィールドが追加されます。ありがとう@Derick – Ewan

+7

yuk、これはどのようにmongoDBの最高のソリューションになることができますか?時間範囲による照会はロケット時間であってはならない – GreyCloud

関連する問題