Метеор: реактивное обновление, каскадное удаление / обновление. Нормализация против денормализации
Как сделать каскадное удаление, обновление и реактивное обновление в существующих объединенных документах? Скажем к примеру присоединяюсь Posts
коллекция с Meteor.users
коллекция с userId()
как автор. Я мог бы сделать функцию преобразования на Posts
Коллекция для получения пользовательских данных автора, как username
и отображать username
автора на любой пост. Проблема в том, когда пользователь меняет свою username
существующие сообщения не будут обновлять автора username
реактивно. И когда вы удаляете родительский документ, дочерние документы все еще там. Я использовал популярные умные пакеты, такие как publish-composite
а также collection-helpers
но проблема все еще существует. Любой эксперт по метеоритным разработкам может помочь мне в этом? Спасибо.
1 ответ
Если вы хотите использовать коллекционные хуки для решения этой проблемы, следующий псевдокод должен помочь вам:
// run only on the server where we have access to the complete dataset
if (Meteor.isServer) {
Meteor.users.after.update(function (userId, doc, fieldNames, modifier, options) {
var oldUsername = this.previous.username;
var newUsername = doc.username;
// don't bother running this hook if username has not changed
if (oldUsername !== newUsername) {
Posts.update({
// find the user and make sure you don't overselect those that have already been updated
author: userId,
authorUsername: oldUsername
}, {$set: {
// set the new username
authorUsername: newUsername
}}, {
// update all documents that match
multi: true
})
}
}, {fetchPrevious: true});
}