首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何查询两个Collections并返回一个响应?

如何查询两个Collections并返回一个响应?
EN

Stack Overflow用户
提问于 2020-04-06 16:43:13
回答 1查看 32关注 0票数 0

我正在尝试得到电影的结果+每部电影的平均评分。信息位于两个不同的集合中。rating集合保存电影ID。

电影-主要收藏

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[
    {
        name: "The Matrix"
        genres: [
            "5e80bc463c410a7291dee8c1",
            "5e80bc463c410a7291dee8c2"
        ],
    },
    {
        name: "The Matrix 2"
        genres: [
            "5e80bc463c410a7291dee8c1",
            "5e80bc463c410a7291dee8c2"
        ],
    }
]

评级

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[
    {
        movie: "5e3355c206c7cd030e48b8bc",
        user: "5e3355c206c7cd030e48b8b4",
        rating: 10
    },
    {
        movie: "5e3355c206c7cd030e48b34c",
        user: "5e3355c206c7cd030e48b544",
        rating: 7
    },
    {
        movie: "5e3355c206c7cd030e4823bc",
        user: "5e3355c206c7cd03344823bc",
        rating: 5
    }
}

我希望得到以下结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "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
        },
    ]
}

我不明白如何将每部电影的平均评分添加到查询结果中。我当前的查询如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
            });
        });
    });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-06 21:48:56

在mongoose术语中,您正在寻找“反向填充”,据我所知,它不是随mongoose一起提供的。(例如,参见Reverse populate in mongoose)。

相反,您可以做的是创建一个聚合mongo查询,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.
    });
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61064735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文