MongoDB查询求助:筛选Action/Adventure类电影仅返回标题
问题排查与解决方案
原代码的核心问题
- 语法严重错误:存在大量括号不匹配问题,多个
$or语句未正确闭合;同时{ genre: $eq:"Adventure"}的写法错误,$eq必须包裹在对象中,正确格式应为{ genre: { $eq: "Adventure" } }。 - 逻辑完全偏离需求:你需要筛选
genre为Action或Adventure的电影,但原代码错误地嵌套了一堆针对特定title的$or条件,完全背离了按类型筛选的目标。 - 混淆查询条件与投影规则:
{ title: 1 }是投影参数(用于指定返回字段),不应放在查询条件的对象中,它是find()方法的第二个参数。 - 冗余的
$and使用:MongoDB默认对多个查询条件执行逻辑与操作,这里仅需单一的类型筛选条件,完全不需要显式声明$and。
可行的正确查询方案
方案1:使用$or实现类型筛选
db.movies.find( // 查询条件:genre是Action或Adventure { $or: [ { genre: "Action" }, { genre: "Adventure" } ] }, // 投影:仅返回title字段,排除默认的_id { title: 1, _id: 0 } )
注:
{ genre: "Action" }是{ genre: { $eq: "Action" } }的简写,MongoDB支持这种简洁写法。
方案2:使用$in更高效实现(推荐)
当筛选同一字段的多个可选值时,$in比$or更简洁且性能更优:
db.movies.find( { genre: { $in: ["Action", "Adventure"] } }, { title: 1, _id: 0 } )
补充说明
- 如果你的
genre字段是数组类型(比如一部电影属于多个类型),上述查询依然有效,MongoDB会自动匹配数组中包含目标值的文档。 - 投影参数中
_id: 0是可选的,但如果不需要返回默认的_id字段,建议显式排除,避免结果冗余。
内容的提问来源于stack exchange,提问作者Kori gray
相关产品推荐
相关产品推荐

