Метеор: реактивное обновление, каскадное удаление / обновление. Нормализация против денормализации

Как сделать каскадное удаление, обновление и реактивное обновление в существующих объединенных документах? Скажем к примеру присоединяюсь 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});
}
Другие вопросы по тегам