在NodeJS Pug问题中显示单个聚合

时间:2018-10-25 07:42:08

标签: node.js mongodb aggregation

我正在使用Wes Bos课程学习NodeJS,但在上一课中,他使用汇总显示了基于平均评分的顶级商店。我认为这真的很好,但是我也想在商店页面上显示商店的平均评分。但是,我设法获得了商店页面上所有商店的averageRating,但我没有设法仅选择要访问的商店页面的averageRating。

我的storeController看起来像这样:

exports.getStoreBySlug = async (req, res, next) => {
    const storesPromise = Store.getTopStores();
    const storePromise = await Store.findOne({ slug: req.params.slug}).populate('author reviews');
    const [store, stores] = await Promise.all([storePromise, storesPromise]);
    res.render('store', { store, title: store.name, store, stores });
};

和getTopStores()看起来像这样:

storeSchema.statics.getTopStores = function() {
    return this.aggregate([
    // Lookup Stores and populate their reviews
    { $lookup: { from: 'reviews', localField: '_id', foreignField: 'store', as: 'reviews' }},
    // filter for only items that have 2 or more reviews
    { $match: { 'reviews.1': { $exists: true } } },
    // Add the average reviews field
    { $project: {
    photo: '$$ROOT.photo',
    name: '$$ROOT.name',
    reviews: '$$ROOT.reviews',
    slug: '$$ROOT.slug',
    averageRating: { $avg: '$reviews.rating' }
    } },
    // sort it by our new field, highest reviews first
    { $sort: { averageRating: -1 }},
    // limit to at most 10
    { $limit: 10 }
    ]);
}

和我的mixin _review看起来像这样:

mixin review(review) 
    each store, i in stores
        .review__header
            .review__author
                 img.avatar(src=${store.author.gravatar})
            .review__stars(title=`Rated ${store.averageRating} out of 5 stars`)
                = `★`.repeat(store.averageRating)
                = `☆`.repeat(5 - store.averageRating)

当然,以上代码显示了每个商店的averageRating。所以我也尝试了这个:

mixin review(review) 
    if store.slug = stores.slug
        .review__header
            .review__author
                img.avatar(src=${store.author.gravatar})
            .review__stars(title=`Rated ${store.averageRating} out of 5 stars`)
                = `★`.repeat(store.averageRating)
                = `☆`.repeat(5 - store.averageRating)

这:

 mixin review(review) 
      -for (var i= 0; i < stores.length; i++)
      if stores[i].store[0] = review.store
          .review__header
              .review__author
                   img.avatar(src=${store.author.gravatar})
              .review__stars(title=`Rated ${stores[i].averageRating} out of 5 stars`)
                   = `★`.repeat(stores[i].averageRating)
                   = `☆`.repeat(5 - stores[i].averageRating)

,但没有成功。.然后我尝试了100种不起作用的变体。 因此,我想要什么:在商店中,他寻找slug =访问页面的商店的averageRating,并仅显示该商店的averageRating。 我认为实现此目标的唯一其他方法是通过更改聚合中的$ match,但我不知道如何。

有人可以帮我吗? 如果对整个代码感兴趣:https://github.com/wesbos/Learn-Node/tree/master/stepped-solutions/45%20-%20Finished%20App

0 个答案:

没有答案