You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:15:38