web-dev-qa-db-fra.com

Comment récupérer l'heure de la dernière mise à jour de chaque document dans MongoDB?

Je voudrais savoir s'il existe un moyen d'obtenir la dernière heure de mise à jour/modification des données (c'est-à-dire des documents) dans une collection dans MongoDB. Plus clairement, je veux faire une requête pour récupérer tous les documents mis à jour après un certain temps.

Existe-t-il des moyens possibles pour récupérer ce dernier horodatage modifié dans MongoDB?

Remarque: Pour les documents nouvellement créés, je sais que nous pouvons récupérer l'horodatage à partir de l'objet ID, mais pour une mise à jour, l'ID va être le même. MongoDB stocke-t-il la dernière heure de mise à jour pour chaque document?

J'utilise la morphie comme pilote Java, donc s'il existe un moyen possible de la morphie, faites-le moi savoir.

20
Sadish Kumar

Vous devez capturer l'heure de la dernière mise à jour vous-même.

Pour mon application, je garde un objet AuditTrail, qui capture AuditEvents. Ces événements se produisent lors de toute insertion, mise à jour ou suppression d'un objet (la suppression est virtuelle dans mon système, il suffit de définir un indicateur).

Pour chaque AuditEvent, je garde la date, l'utilisateur authentifié, l'action db et une description remplie par l'application. Ceci est implémenté dans PersistentObject, il est donc automatiquement appelé pour toute action de base de données de tout objet enregistré dans Mongo.

Cette mise à jour a pris très peu de temps, mais offre à la fois la possibilité d'obtenir la dernière heure de mise à jour, ainsi que toute autre information dont vous pourriez avoir besoin pour la sécurité et le support client pour tout dans Mongo.

15
Ramesh

Non, MongoDB en lui-même ne stocke ni horodatage de création ni de mise à jour. Vous devez le faire vous-même (et comme vous l'avez découvert, si vous utilisez un ObjectID _id, vous obtenez déjà la date de création).

7
Thilo

Vous pouvez soit utiliser une entité de piste d'audit comme @ user1530669 l'a mentionné (j'appelle le mien delta - le code est déjà disponible quelque part sur StackOverflow).

Ou vous pouvez simplement enregistrer la dernière heure de modification. J'utilise généralement une entité de base pour configurer cela et toutes les autres entités l'étendent (pour vos besoins spécifiques, vous pouvez probablement supprimer le creationDate car le lastChange vous suffit):

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();
}

Et dans vos requêtes, vous pouvez ensuite ajouter un filtre afin que l'attribut lastChange soit plus récent que votre limite de récupération.

4
xeraa