Comment récupérer la dernière mise à jour de chaque document en MongoDB?

je voudrais savoir s'il y a un moyen d'obtenir la dernière mise à jour/modification de l'heure des données (I. e documents) dans une collection en MongoDB. Plus clairement, je veux faire une requête pour récupérer tous les documents mis à jour après un moment particulier.

y a-t-il un moyen de récupérer ce dernier horodatage modifié en MongoDB?

Note: pour les documents nouvellement créés, je sais que nous pouvons récupérer l'horodatage à partir de l'objectId, mais pour une mise à jour, l'id sera le même. Faire MongoDB stocker la dernière heure de mise à jour pour chaque document n'importe où?

j'utilise morphia comme pilote java, donc s'il y a un moyen possible depuis morphia, veuillez me le faire savoir.

17
demandé sur Tezra 2012-12-20 13:15:53

3 réponses

vous devez capturer vous-même la dernière mise à jour.

pour mon application, je garde un objet AuditTrail, qui capture des événements Audit. Ces événements se produisent sur n'importe quel insert, mise à jour ou suppression d'un objet (delete est virtuel dans mon système, il suffit de mettre un drapeau).

pour chaque événement audité, je garde trace de la date, utilisateur authentifié, action db, et une description remplie par l'application. Ceci est implémenté dans PersistentObject, de sorte qu'il est automatiquement appelé pour tout action de base de données de tout objet enregistré dans Mongo.

cette mise en œuvre a pris très peu de temps, mais fournit à la fois la possibilité d'obtenir le dernier temps de mise à jour, et aussi toute autre information dont vous pourriez avoir besoin pour la sécurité et le soutien client pour tout dans Mongo.

14
répondu Ramesh 2012-12-20 09:37:53

Non, MongoDB par lui-même ne stocke pas la création ou la mise à jour des horodateurs. 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).

6
répondu Thilo 2012-12-20 09:18:36

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

ou vous pouvez simplement sauver le dernier temps de changement. J'utilise généralement une entité de base pour configurer cela et toutes les autres entités l'étendent (pour votre exigence spécifique, vous pouvez probablement supprimer le creationDatelastChange c'est assez pour vous):

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 de sorte que le lastChange attribut est plus récent que votre limite de récupération.

3
répondu xeraa 2012-12-20 15:00:12