25

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

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

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

javaドライバとしてmorphiaを使っているので、morphiaから抜けられる方法があれば教えてください。

4

4 に答える 4

17

最終更新時刻を自分で取得する必要があります。

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

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

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

于 2012-12-20T09:37:53.813 に答える
7

いいえ、MongoDB 自体は、作成または更新のタイムスタンプを保存しません。自分でそれを行う必要があります (そして、お気づきのように、 ObjectID _id を使用すると、作成日が既に取得されています)。

于 2012-12-20T09:18:36.277 に答える
5

@ user1530669が述べたように、監査証跡エンティティを使用することができます(私は私のデルタと呼んでいます-コードはStackOverflowのどこかですでに利用可能です)。

または、最後の変更時間を節約することもできます。私は通常、基本エンティティを使用してそれを設定し、他のすべてのエンティティがそれを拡張します(特定の要件については、おそらく削除できcreationDateますlastChange):

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そして、クエリで、属性が取得制限よりも新しいようにフィルターを追加できます。

于 2012-12-20T15:00:12.010 に答える
2

次のことができます。MongoDB バージョン 4.2+では、 $toDateObjectId "_id" からタイムスタンプを抽出する 同時に、集計演算子を実行できるようになりupdateました。

ここでは、集計クエリを使用して$toDateMongoDB の ObjectId "_id" フィールドからタイムスタンプを抽出し、{$replaceRoot: {newRoot: "$$ROOT"}}明示的に記述する代わりに使用してドキュメントを更新します。$set

var collection = "person"

agg_query = [
    {
        "$addFields" : {
            "_last_updated" : {
                "$toDate" : "$_id"
            }
        }
    },
    {
        $replaceRoot: {
            newRoot: "$$ROOT"
        } 
    }
]

db.getCollection(collection).updateMany({}, agg_query, {upsert: true})
于 2020-04-15T11:17:42.453 に答える