2015-07-07 2 views
0

Я работаю над проектом метеор, где мне нужно получить среднее количество очков обзора. Я наткнулся на meteorhacks: совокупный пакет, но не смог его реализовать.Meteor Avg Aggregate from Publish to Helpers

публикации:

Meteor.publish('supplierReviewsOverall', function(userid){ 

var pipeline = [ 
    { 
     $match: { 
      supplier: userid 
     } 
    }, 
    { 
     $group: { 
      _id: null, 
      rate_overall : { $avg: "$rate_overall" }, 
      rate_timeliness : { $avg: "$rate_timeliness" }, 
      rate_quality : { $avg: "$rate_quality" }, 
      rate_value : { $avg: "$rate_value" } 
     } 
    } 
] 

return SupplierReviews.aggregate(pipeline); 
}); 

И я получаю эту ошибку: Ошибка: Опубликовать функция вернула массив не-курсоров.

Затем, как я получу значение для помощника, чтобы я мог поместить данные в HTML?

Большое спасибо !!!

ответ

2

Основной ответ: это потому, что вам нужно вернуть Cursor в публикации.

Вы тоже возможности:

  1. Вы можете воссоздавать курсор, используя свой результат агрегирования но имейте в виду, вы потеряете реакционная способность: это означает, что кроме случаев, когда вы загрузите шаблон, вы не будете получать внешние обновления , Чтобы добиться этого, вам просто нужно обернуть SupplierReviews.aggregate(pipeline); в var buffer = SupplierReviews.aggregate(pipeline); и перебирать на нем, чтобы добавить каждый элемент вашего массива в вашей публикации курсора:

    _(buffer).each(function(item){ self.added ('SupplierReviews', item._id, item); }; self.ready();

  2. Моя любимая Personnal: вам не нужно агрегировать (и свободную реактивность для достижения операции average. Вы можете использовать простой запрос Collection.find() и расширить/уменьшить/изменить его, используя умное сочетание cursor.Observe и условные модификации. Посмотрите на этот ответ, он сделал трюк для меня (мне нужно было сумма, но вы можете легко адаптировать ее к среднему): https://stackoverflow.com/a/30813050/3793161
  3. Если вы планируете га несколько серверов, следует предупредить, что каждый сервер будет иметь значение observe, поэтому это может привести к ненужной нагрузке. Итак, мое третье решение - либо use collection hooks, либо методы для обновления дополнительного поля average для каждого значения, которое вам нужно. См. @David Weldon ответ об этом здесь: https://stackoverflow.com/a/31190896/3793161
+0

Спасибо за это! Мне нравится первый подход, хотя я потеряю реактивность. Мой вопрос: как я могу получить к нему доступ в помощнике, чтобы я мог распечатать его в представлении? Благодаря! – user3545006

+0

Вам необходимо подписаться на вашу публикацию. После этого вы можете получить доступ к своим данным в контексте данных шаблона, если вы привяжете его к нему. Внутри вашего помощника, в зависимости от того, где он, это будет 'this.data.yourData' или' this.yourData'. Второе решение, у вас будет прямой доступ к минимальной версии коллекции «SupplierReviews». Вы можете получить доступ к нему «напрямую» с помощью 'SupplierReviews.find()'. Взгляните сюда на лучшее понимание: https://www.discovermeteor.com/blog/understanding-meteor-publications-and-subscriptions/ – Billybobbonnet