hint() 只在查询层生效且不绕过索引过滤器,必须在游标构建阶段调用,需严格匹配复合索引字段顺序与方向,受索引过滤器限制,Spring Data 中用 withHint() 设置 Document 类型提示。
能强制,但必须清楚它只在查询层生效,且不会绕过索引过滤器逻辑。
MongoDB 的
是调试和临时干预手段,不是索引调度的“开关”。
hint() 必须用在游标上,不能直接加在 find() 返回结果后
常见错误是写成
—— 看似合理,但
必须在游标构建阶段调用,否则会被忽略。mongosh 中正确顺序是:
或链式调用:
(注意
是客户端过滤,不推荐)
复合索引要严格匹配字段顺序和方向:比如索引是
,hint 就得写成
,写成
可能被拒绝或降级为全表扫描
使用 $hint 时 explain() 要放在同一查询结构里
当用老式写法
,就不能再额外加
链式调用。必须把
放进同一个文档:
否则会报错
。新写法(
)更直观,推荐优先使用。
hint() 在有索引过滤器(index filter)时会被完全忽略
MongoDB 允许为集合设置索引过滤器(通过
),一旦设置了,所有对该集合的查询都会被约束在过滤器定义的索引范围内。此时无论你传什么
,只要不在过滤器白名单里,就会被静默丢弃——
的
里也看不到 hint 生效痕迹。
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
检查是否存在过滤器:
清除过滤器:
索引过滤器是 server 端策略,比客户端
优先级更高
Java Spring Data MongoDB 怎么传 hint?
Spring Data MongoDB 的
对象不直接暴露
方法,但可通过
设置:
注意两点:
接收的是
,不是字符串索引名(区别于 shell 中可传字符串如
)
如果该索引不存在,驱动不会报错,但执行计划里会显示
,务必结合
验证
真正容易被忽略的点是:hint 不解决索引设计缺陷。比如你对
强制 hint,但查询只用了
,而没带
条件,那复合索引的后半段就浪费了——这时应该建一个单字段索引,而不是靠 hint 硬撑。
hint()db.users.find({age: {$gt: 25}}).hint({age: 1}).toArray()hint()db.users.find({age: {$gt: 25}}).hint({age: 1}).toArray()db.users.find().hint({age: 1}).filter({age: {$gt: 25}}).toArray()filter(){user_id: 1, order_time: -1}.hint({user_id: 1, order_time: -1}){user_id: 1, order_time: 1}db.users.find({$query: {age: {$gt: 25}}, $hint: {age: 1}}).explain()$explaindb.users.find({
$query: {age: {$gt: 25}},
$hint: {age: 1},
$explain: "executionStats"
})unrecognized field '$explain'.hint().explain()planCacheSetFilterhint()explain()queryPlanner.winningPlandb.runCommand({planCacheListFilters: "users"})db.runCommand({planCacheClearFilters: "users"})hint()Queryhint()withHint()Query query = new Query(Criteria.where("age").gt(25));
query.withHint(new Document("age", 1));
mongoTemplate.find(query, User.class, "users");withHint()Document"age_1"stage: "COLLSCAN"explain(){status: 1, created_at: -1}statuscreated_at