3

MongoDB のドキュメントでは、別の時間フィールドを使用するのではなく、ObjectId から挿入時間を抽出することを推奨しています。Spring Data MongoDB でこれを行う方法を知っている人はいますか?

特に、特定の日付範囲に挿入されたドキュメントを照会したいと考えています。

4

3 に答える 3

7

...から時間を取得するのは簡単ObjectIdですが、ミリ秒の精度は得られません。

org.bson.types.ObjectIdgetTimeSecond()には、 と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表しますObjectIdObjectId(Date time)

于 2012-07-12T03:07:00.377 に答える
1

そこには推奨事項がありません。ドキュメントには、ObjectIdから挿入時間を取得できると記載されているだけです。ドキュメントに記載されているように、_idによる並べ替えは挿入時間による並べ替えでもあります。

特定の追加の努力で、等式/範囲クエリを実行することは可能ですが、私はそのために別の(インデックス付きの)フィールドを使用します。

于 2012-07-11T16:53:09.113 に答える
1

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
于 2012-07-19T14:03:31.907 に答える