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

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

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

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

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


person Sadish Kumar    schedule 20.12.2012    source источник
comment
Возможный дубликат stackoverflow.com/ вопросы/9462656/   -  person Ray Toal    schedule 20.12.2012


Ответы (4)


Вам нужно зафиксировать время последнего обновления самостоятельно.

Для своего приложения я сохраняю объект AuditTrail, который фиксирует события AuditEvents. Эти события происходят при любой вставке, обновлении или удалении объекта (удаление в моей системе является виртуальным, просто устанавливается флаг).

Для каждого AuditEvent я отслеживаю дату, аутентифицированного пользователя, действие базы данных и описание, заполняемое приложением. Это реализовано в PersistentObject, поэтому он автоматически вызывается для любого действия с базой данных любого объекта, сохраненного в Mongo.

Реализация этого факта заняла очень мало времени, но дает возможность получить время последнего обновления, а также любую другую информацию, которая может вам понадобиться для безопасности и поддержки клиентов для всего в Mongo.

person Ramesh    schedule 20.12.2012
comment
Нет, только в моем фреймворке DAO. Я не рассматривал выпуск своего кода для сообщества. У меня нет никаких проблем, просто никогда не думал об этом. - person Ramesh; 23.02.2017

Нет, MongoDB сама по себе не хранит временные метки ни создания, ни обновления. Вы должны сделать это самостоятельно (и, как вы узнали, если вы используете ObjectID _id, вы уже получаете дату создания).

person Thilo    schedule 20.12.2012
comment
Не совсем так. Однако MongoDB хранит createdTime... мы можем получить к нему доступ через ObjectId(theIdofThedocumen).getTimeStamp() - person Amin Mohamed Ajani; 11.05.2017
comment
@AminMohamedAjani: Только если вы используете ObjectId, созданный во время создания документа, для поля _id (вам не обязательно). - person Thilo; 11.05.2017
comment
О да, конечно, ты прав. Но я думаю, что всегда лучше, если мы не перезапишем _id... - person Amin Mohamed Ajani; 12.05.2017
comment
Отметка времени создания объекта. Как упоминал @AminMohamedAjani, ObjectId(507c7f79bcf86cd7994f6c0e).getTimestamp() работает, но это отметка времени создания объекта. - person Abhijeet; 12.09.2018

Вы можете либо использовать объект контрольного журнала, как упоминалось @ 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 был более свежим, чем ваш лимит поиска.

person xeraa    schedule 20.12.2012

Вы можете сделать следующее. В MongoDB версии 4.2+ теперь вы можете выполнять операторы агрегирования, такие как $toDate, для одновременного извлечения метки времени из ObjectId "_id" и update.

Здесь мы используем агрегированный запрос $toDate для извлечения метки времени из поля ObjectId «_id» MongoDB и обновления документов с использованием {$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})
person Yi Xiang Chong    schedule 15.04.2020