MongoDB查询求助:如何获取首字母为I/J的英雄及其导师?
问题解决:查询首字母为I/J的英雄姓名及导师
你的代码问题分析
- 语法结构错误:
$project阶段的嵌套大括号完全不符合MongoDB聚合语法规范,聚合阶段的字段定义应为键值对形式,不能错误嵌套条件判断。 - 函数参数错误:字符串截取函数(推荐用
$substrCP)的参数需要是数组格式,正确写法是{$substrCP: ["$name", 0, 1]},而非你写的{$substr : {$name, 0,1}}。 - 逻辑位置错误:过滤首字母的条件应该放在
$match阶段(先筛选符合条件的文档,性能更优),而非$project阶段——$project的作用是选择/生成字段,不是过滤文档。 - 字段引用错误:引用文档字段时必须加引号,比如
"$name",不能直接写$name。
正确查询代码
方法一:先过滤再投影(推荐,性能更高)
db.collection.aggregate([ // 第一步:筛选首字母为I或J的文档 { $match: { $expr: { $in: [{$substrCP: ["$name", 0, 1]}, ["I", "J"]] } } }, // 第二步:只返回name和mentor字段(_id默认会返回,要去掉的话加"_id": 0) { $project: { name: 1, mentor: 1, _id: 0 // 可选,不需要_id的话加上 } } ])
方法二:在投影中标记符合条件的文档(适合特殊场景)
如果非要在$project里处理,可以生成临时判断字段再过滤,但性能不如先筛选:
db.collection.aggregate([ { $project: { name: 1, mentor: 1, _id: 0, isMatch: { $in: [{$substrCP: ["$name", 0, 1]}, ["I", "J"]] } } }, { $match: { isMatch: true } }, { $project: { isMatch: 0 } // 去掉临时判断字段 } ])
补充说明
$substrCP是MongoDB 3.4+推荐的字符串截取函数,支持Unicode字符,比旧的$substr更可靠。- 如果集合中
mentor是数组类型(当前示例为单个字符串),代码无需修改,$project会直接返回整个数组。
内容的提问来源于stack exchange,提问作者qYUUU
相关产品推荐
相关产品推荐

