Подтвердить что ты не робот

Как получить последнее время обновления каждого документа в MongoDB?

Я хотел бы знать, есть ли способ получить последнее обновление/изменить время данных (например, документы) в коллекции в MongoDB. Более четко, я хочу сделать запрос на получение всех документов, обновленных по истечении определенного времени.

Есть ли какие-либо возможные способы получить эту последнюю измененную метку времени в MongoDB?

Примечание. Для вновь созданных документов я знаю, что мы можем получить временную метку из объекта, но для обновления идентификатор будет таким же. Сохраняет ли MongoDB последнее время обновления для каждого документа в любом месте?

Я использую morphia как java-драйвер, поэтому, если есть какой-либо возможный путь от morphia, сообщите мне.

4b9b3361

Ответ 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 был более поздним, чем ваш предел поиска.