Как получить последнее время обновления каждого документа в MongoDB?
Я хотел бы знать, есть ли способ получить последнее обновление/изменить время данных (например, документы) в коллекции в MongoDB. Более четко, я хочу сделать запрос на получение всех документов, обновленных по истечении определенного времени.
Есть ли какие-либо возможные способы получить эту последнюю измененную метку времени в MongoDB?
Примечание. Для вновь созданных документов я знаю, что мы можем получить временную метку из объекта, но для обновления идентификатор будет таким же. Сохраняет ли MongoDB последнее время обновления для каждого документа в любом месте?
Я использую morphia как java-драйвер, поэтому, если есть какой-либо возможный путь от morphia, сообщите мне.
Ответы
Ответ 1
Вам нужно самому записать последнее время обновления.
Для моего приложения я сохраняю объект AuditTrail, который захватывает AuditEvents. Эти события происходят при любой вставке, обновлении или удалении объекта (удаление в моей системе виртуально, просто установка флага).
Для каждого AuditEvent я отслеживаю дату, аутентифицированный пользователь, действие db и описание, заполненное приложением. Это реализовано в PersistentObject, поэтому оно автоматически вызывается для любого действия базы данных любого объекта, сохраненного в Mongo.
В действительности это заняло очень мало времени для реализации, но обеспечивает как возможность получить последнее время обновления, так и любую другую информацию, которая вам может понадобиться для обеспечения безопасности и поддержки клиентов для всего, что находится в Монго.
Ответ 2
Нет, MongoDB сам по себе не хранит ни метки времени создания, ни даты обновления. Вы должны сделать это сами (и, как вы узнали, если вы используете ObjectID _id, то вы уже даете дату создания).
Ответ 3
Вы можете использовать объект аудита для отслеживания как упомянутый @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
был более поздним, чем ваш предел поиска.