MongoDB のドキュメントでは、別の時間フィールドを使用するのではなく、ObjectId から挿入時間を抽出することを推奨しています。Spring Data MongoDB でこれを行う方法を知っている人はいますか?
特に、特定の日付範囲に挿入されたドキュメントを照会したいと考えています。
MongoDB のドキュメントでは、別の時間フィールドを使用するのではなく、ObjectId から挿入時間を抽出することを推奨しています。Spring Data MongoDB でこれを行う方法を知っている人はいますか?
特に、特定の日付範囲に挿入されたドキュメントを照会したいと考えています。
...から時間を取得するのは簡単ObjectId
ですが、ミリ秒の精度は得られません。
org.bson.types.ObjectId
getTimeSecond()
には、 とgetTime()
( と同じ) の2 つの方法があります`getTimeSecond() * 1000L
。これらはあなたのUNIXタイムスタンプを取得します。
私はSpringでMongoDBを使用していませんが、実際のインスタンスを手に入れることができれば、ObjectId
上記のメソッドの1つを呼び出すのと同じくらい簡単です.
現在 - 時間範囲内のドキュメントをクエリするにObjectId
は、タイムスタンプに基づいてオブジェクトを作成する必要があります。繰り返しますが、これは簡単ObjectId
です。これを実行できるコンストラクターがあります。
ObjectId(Date time)
したがってObjectId
、最小時間と最大時間の境界を表す 2 つのインスタンスを作成し、次のようなクエリを実行します。
db.collection.find({ "field" : { $gt: value1, $lt: value2 } } );
wherevalue1
とは、作成したインスタンスをvalue2
表しますObjectId
ObjectId(Date time)
そこには推奨事項がありません。ドキュメントには、ObjectIdから挿入時間を取得できると記載されているだけです。ドキュメントに記載されているように、_idによる並べ替えは挿入時間による並べ替えでもあります。
特定の追加の努力で、等式/範囲クエリを実行することは可能ですが、私はそのために別の(インデックス付きの)フィールドを使用します。
phatduckk のガイダンスのおかげで、必要なことを実行する Spring Data のコード スニペットを次に示します。
org.springframework.data.mongodb.core.query.Criteria criteria = ...;
if (startTimestamp != null || endTimestamp != null) {
criteria = criteria.and("_id");
if (startTimestamp != null) {
criteria = criteria.gte(new ObjectId(startTimestamp.toDate()));
}
if (endTimestamp != null) {
criteria = criteria.lt(new ObjectId(endTimestamp.toDate()));
}
}
// use criteria