我正在尝试得到电影的结果+每部电影的平均评分。信息位于两个不同的集合中。rating集合保存电影ID。
电影-主要收藏
[
{
name: "The Matrix"
genres: [
"5e80bc463c410a7291dee8c1",
"5e80bc463c410a7291dee8c2"
],
},
{
name: "The Matrix 2"
genres: [
"5e80bc463c410a7291dee8c1",
"5e80bc463c410a7291dee8c2"
],
}
]
评级
[
{
movie: "5e3355c206c7cd030e48b8bc",
user: "5e3355c206c7cd030e48b8b4",
rating: 10
},
{
movie: "5e3355c206c7cd030e48b34c",
user: "5e3355c206c7cd030e48b544",
rating: 7
},
{
movie: "5e3355c206c7cd030e4823bc",
user: "5e3355c206c7cd03344823bc",
rating: 5
}
}
我希望得到以下结果:
{
"total": 1,
"page": 0,
"perPage": 25,
"pageSize": 1,
"movies": [
{
_id: "5e3b0e57870c15002e29a238",
name: 'The Matrix',
genres: ['Action', 'Sci-Fi'],
rating: 10
},
{
_id: "5e3b0e57870c15002e29a239",
name: 'The Matrix 2',
genres: ['Action', 'Sci-Fi'],
rating: 10
},
]
}
我不明白如何将每部电影的平均评分添加到查询结果中。我当前的查询如下所示:
Movie.find(demand)
.select("name genres")
.skip(page * limit)
.limit(limit)
.populate('genres', ['name'])
.lean()
.exec((err, movies) => {
if (err) {
return res.json(err);
}
Movie.countDocuments(demand).exec((count_error, count) => {
if (err) {
return res.json(count_error);
}
return res.status(200).json({
total: count,
page: page,
perPage: limit,
pageSize: movies.length,
movies: movies
});
});
});
发布于 2020-04-07 05:48:56
在mongoose术语中,您正在寻找“反向填充”,据我所知,它不是随mongoose一起提供的。(例如,参见Reverse populate in mongoose)。
相反,您可以做的是创建一个聚合mongo查询,如下所示:
Movie.aggregate([{
$match: demand
}, {
$skip: page * limit
}, {
$limit: limit
}, {
$lookup: {
from: "ratings",
localField: "_id",
foreignField: "movie",
as: "ratings"
}
}, {
$project: {
name: 1,
genres: 1,
ratting: {$avg: "$ratings.rating"}
}
}]).exec((err, movies) => {
if (err) {
return res.json(err);
}
Genre.populate(movies, {path: 'genres', select: 'name'}, (err, movies) => {
if (err) {
return res.json(err);
}
// rest of your code to count etc.
});
});
https://stackoverflow.com/questions/61064735
复制相似问题