web-dev-qa-db-ja.com

MongoDBの各ドキュメントの最終更新時間を取得するにはどうすればよいですか?

MongoDBのコレクション内のデータ(ドキュメントなど)の最終更新/変更時刻を取得する方法があるかどうか知りたいのですが。より明確には、特定の時間以降に更新されたすべてのドキュメントを取得するクエリを作成したいと思います。

MongoDBでこの最後に変更されたタイムスタンプを取得する方法はありますか?

注:新しく作成されたドキュメントの場合、objectIdからタイムスタンプを取得できることはわかっていますが、更新の場合、IDは同じになります。 MongoDBは各ドキュメントの最終更新時刻をどこにでも保存しますか?

Javaドライバーとしてモルフィアを使用しているので、モルフィアから可能な方法がある場合は、私に知らせてください。

20
Sadish Kumar

最終更新時間を自分でキャプチャする必要があります。

私のアプリケーションでは、AuditEventsをキャプチャするAuditTrailオブジェクトを保持しています。これらのイベントは、オブジェクトの挿入、更新、または削除時に発生します(システムで削除は仮想であり、フラグを設定するだけです)。

AuditEventごとに、日付、認証されたユーザー、dbアクション、およびアプリケーションによって入力された説明を追跡します。これはPersistentObjectに実装されているため、Mongoに保存されているオブジェクトのデータベースアクションに対して自動的に呼び出されます。

この実際の実装にはほとんど時間がかかりませんでしたが、最終更新時間を取得する機能と、Mongoのすべてのセキュリティとカスタマーサポートに必要なその他の情報の両方が提供されます。

15
Ramesh

いいえ、MongoDB自体には、作成タイムスタンプも更新タイムスタンプも保存されません。あなたはそれを自分でしなければなりません(そして、あなたが知っているように、もしあなたがObjectID _idを使用すれば、あなたはすでに作成日を取得しています)。

7
Thilo

@ user1530669が言及しているように監査証跡エンティティを使用することもできます(私はmine deltaを呼び出しています-コードはStackOverflowのどこかですでに利用可能です)。

または、最終変更時刻を保存することもできます。私は通常、ベースエンティティを使用してそれを設定し、他のすべてのエンティティがそれを拡張します(特定の要件では、creationDatelastChangeで十分なので、おそらく削除できます)。

protected Date creationDate;
protected Date lastChange;

// Getters and setters or final setters which don't do anything,
// if you only want to allow the entity to update the values

@PrePersist
public void prePersist() {
    creationDate = (creationDate == null) ? new Date() : creationDate;
    lastChange = (lastChange == null) ? creationDate : new Date();
}

そして、クエリにlastChange属性が検索制限よりも新しいものになるようにフィルターを追加できます。

4
xeraa