我正在使用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