【问题标题】:How to query two Collections and return one response?如何查询两个集合并返回一个响应?
【发布时间】:2020-07-18 17:49:16
【问题描述】:

我正在尝试获得电影的结果 + 每部电影的平均评分。 信息位于两个不同的集合中。评分集合保存电影 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
            });
        });
    });

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    在猫鼬方面,您正在寻找“反向填充”,这(据我所知)并没有随 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.
        });
    });
    
    

    【讨论】:

    • 这立即奏效了。反向填充甚至可以开箱即用。谢谢楼主
    猜你喜欢
    • 2019-10-08
    • 2019-08-11
    • 2019-01-26
    • 1970-01-01
    • 2017-12-04
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多