0

40kのドキュメントを含むJSONファイルがあり、各ドキュメントには日付フィールドが含まれています。データを取得するには、Java内で日付をクエリする必要があるため、日付をnumberLong形式で保存しました。

Date dt = new Date();
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
dt = format.parse(nextLine[j]);
document.put(ColumnNameAsKey[j], dt.getTime());

上記のコードは、APIのforループで実行され、データをmongoに格納します。しかし、これらすべてのデータを入力した後、同じ日付のnumberlong変更を自動的に照会すると、必要な日付のすべてのデータを取得できなくなります。取得するクエリは

querygraph.put("Complaint Date (MM/DD/YYYY)", new 
    BasicDBObject("$gte",startdate.getTime()).append("$lte",EndDate.getTime()));

たとえば、日付08/01/2012に多数のドキュメントが含まれている場合、日付08/01/2012の正しいnumberlongがmongoの日付フィールドに置き換えられます。これは継続されますが、いくつかのドキュメントの後、numberlongは変化し続けます。つまり、2012年8月1日の日付でNumberLongが134353300000の場合、6つ以上のドキュメントの後、numberlongは前のドキュメントとは異なります。 2012年8月1日の日付の正確なデータを取得できません。ここで違いは何ですか?

4

1 に答える 1

1

ミリ秒の時間精度を保存すると、1日の一部を表す長いintで問題が発生し、たとえば深夜を過ぎてクエリを実行できなくなるため、問題が発生したと思います。

これは、MongoDBクエリがこの種のコンテキストクエリを考慮していないためです。

まずヒントとして、数字のlongとして保存せず、次$dateの行のみを使用してBSONタイプとして保存します。

Date dt = new Date();
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");

指定されたBSON日付タイプを使用すると、より多くの機能が得られ、クエリ機能は全体的に同じです。

レコードのクエリについて正しい考えがあります。

querygraph.put("Complaint Date (MM/DD/YYYY)", new 
    BasicDBObject("$gte",startdate.getTime()).append("$lte",EndDate.getTime())); 

しかし、私はあなたが何か間違ったことをしているような気がしました。00:00:00開始日と終了日を作成するとき、実際には開始日の時刻と終了日の時刻を探してい23:59:59ます。これはgetTime()関数によるものです。UNIXタイムスタンプは部分的な時間を返さないため、事実上デフォルトの値を返すだけですnow()

これを回避する1つの方法は、このフィールドの時刻を標準化して00:00:00、すべての日付の時刻を指定し、範囲を正しく選択できるようにすることです。

于 2012-11-20T11:17:54.810 に答える