MongoDB多条件查询修改:实现标题/评分单独或组合搜索
解决多条件电影搜索问题:支持标题、评分及组合搜索
你的代码逻辑本身是对的,MongoDB 会自动将查询对象中的多个字段条件用 $and 逻辑合并,不需要手动写 $and 操作符。没成功可能是参数传递细节或者空值处理的问题,下面是优化后的代码,同时解决原代码中循环查询评论的性能问题:
static async getMovies({ filters = null, page = 0, moviesPerPage = 20, } = {}) { let query = {}; if (filters) { // 仅当title有有效内容时添加正则匹配 if (filters.title?.trim()) { query.title = { $regex: filters.title.trim(), $options: "i" }; } // 仅当rated有值时添加精确匹配 if (filters.rated !== undefined && filters.rated !== null) { query.rated = filters.rated; // $eq可以省略,直接写值就是精确匹配 } } try { // 先查询电影列表 const moviesList = await movies.find(query) .limit(moviesPerPage) .skip(moviesPerPage * page) .toArray(); // 批量查询评论,避免循环多次请求数据库(性能优化) if (moviesList.length > 0) { const movieIds = moviesList.map(movie => movie._id); const allReviews = await reviews.find({ movie_id: { $in: movieIds } }).toArray(); // 将评论映射到对应电影 const reviewsMap = new Map(); allReviews.forEach(review => { const movieId = review.movie_id.toString(); if (!reviewsMap.has(movieId)) { reviewsMap.set(movieId, []); } reviewsMap.get(movieId).push(review); }); moviesList.forEach(movie => { movie.review = reviewsMap.get(movie._id.toString()) || []; }); } const totalNumMovies = await movies.countDocuments(query); return { moviesList, totalNumMovies }; } catch (e) { console.error(`查询失败: ${e}`); return { moviesList: [], totalNumMovies: 0 }; } }
关键说明:
- 多条件自动合并:当你同时传入
title和rated时,MongoDB 会自动按「同时满足标题匹配+评分精确相等」的逻辑查询,无需手动添加$and。 - 空值过滤:新增了对
title空字符串、rated空值的判断,避免无效条件干扰查询。 - 性能优化:原代码循环查询每部电影的评论会产生大量数据库请求,改成批量查询后用 Map 映射,大幅提升效率。
测试用例:
- 仅按标题搜索:
getMovies({ filters: { title: "星际" } }) - 仅按评分搜索:
getMovies({ filters: { rated: "PG-13" } }) - 同时按两者搜索:
getMovies({ filters: { title: "星际", rated: "PG-13" } })
内容的提问来源于stack exchange,提问作者philip_2605
相关产品推荐
相关产品推荐

