2017-02-03 3 views
0

У меня есть коллекция комментариев и коллекция страниц. Комментарии принадлежат страницам. Пользователи могут обновлять комментарии, и я хочу отобразить агрегированную сумму всех голосов комментариев, принадлежащих странице. Что было бы хорошим способом сделать это?Должен ли я использовать AutoValue для хранения агрегированных значений коллекции?

Я думал о том, чтобы держать сумму в AutoValue внутри коллекции страниц. Будет ли способ иногда инициировать пересчет AutoValue? Мне не нужна сумма, которая будет обновляться в реальном времени, раз в 5 минут.

Или это плохая идея? Было бы лучше использовать ReactiveVar в шаблоне для вычисления или что-то еще?

Редактировать: На самом деле нет особых особенностей в настройке. Просто коллекция комментариев с числовым атрибутом «голосов» и коллекцией страниц с числовой оценкой «оценка», которая должна подсчитывать голоса. Страницы:

Collections.Pages = new Mongo.Collection("pages"); 

var PageSchema = new SimpleSchema({ 
    name: { 
     type: String, 
     min: 1 
    }, 
    score: { 
     type: Number, 
     autoValue: function (doc) { 
       var maxValue = 1; 
       Collections.Comments.find({ pageId: doc.pageId }).map(function(mapDoc){ 
        maxValue += mapDoc.votes; 
       }); 
       return maxValue; 
     } 
    }, 

В комментарии:

Collections.Comments = new Mongo.Collection("comments"); 

var CommentSchema = new SimpleSchema({ 
    pageId: { 
     type: String 
    }, 
    name: { 
     type: String, 
     optional: true 
    }, 
    votes: { 
     type: Number, 
     label: 'Total Votes', 
     defaultValue: 0 
    }, 
+0

можете ли вы публиковать код для схем и издателей? – zim

+0

См. Править. Издателю ничего не стоит публиковать, поскольку теперь он просто возвращает сообщение и его комментарии. – Cos

ответ

2

Может быть альтернативный подход к периодическим/приуроченных пересчетов может быть просто пересчитывать значение в одной коллекции в ответ на изменение в другой коллекции. Вы сказали, что вам не нужно нужно в реальном времени, но я не думаю, что вы не возражаете, если бы это было в реальном времени.

У меня была аналогичная проблема, и я использовал комплект мечей для сбора метеоров (см. https://github.com/matb33/meteor-collection-hooks).

Пример:

Collection.comments.after.update(function(userId, doc) { // make update to aggregated value in Collections.pages });

+0

В итоге я использовал наблюдателя для сбора изменений коллекции (без добавления нового пакета). Спасибо за совет! – Cos

0

я сделал что-то подобное: я имел Новости элементов с комментариями, и я хотел бы отслеживать количество комментариев на новость без того, чтобы опубликовать все комментарии.

Я выбрал, чтобы дать новости commentCount поле. У меня были методы добавления и удаления комментариев, и в рамках этой обработки я просмотрел связанный элемент новостей и увеличил или уменьшил его количество.

Что вы нашли с помощью своего решения схемы, так это то, что нет четкого способа запуска autoValue. (это интересное использование autoValue, кстати, я буду иметь в виду это для будущего использования).

, так что я думаю, что вы остаетесь с этим выбором:

  1. создать методы upvote/downvote для голосов. в обработчике методов, выполните вычисления для общего количества голосов и сохраните обновленную стоимость вместе с сообщением. это похоже на то, что я сделал с новостями/комментариями.

  2. Как предложил Дэвид, используйте крючки для коллекции, чтобы сделать что-то похожее на # 1. хотя я использую крючки для коллекций, обычно, когда у меня нет четкого крючка в то, что я хочу сделать, это больше всего, или обработка отключена от того, что я не полностью контролирую.

  3. позаботься об этом в публикации. когда вы публикуете страницу, также просматривайте подсчет голосов и просто динамически добавляете объект публикации.Обратите внимание, что это не будет повторно публиковать страницу при изменении голосов, поэтому вы потеряете эту реактивность; вы указали, что с обновлениями вы были в порядке.

Получение этого обновления было бы немного сложным, потому что вам пришлось бы заставить издателя работать снова. например путем отмены подписки и повторной подписки.

из этих 3, исходя из того, что я понимаю о вашей проблеме, мне нравится их в представленном порядке. # 3 чувствует себя наименее жизнеспособным, но я упоминаю его в случае, если он вписывается в что-то еще, что вы делаете.

Смежные вопросы