问题描述
我正在设计一个架构,其中一个User
文档存储着Skill
id。 Skill
文档看起来像这样
Skill = {
id: ObjectId
title: String
description: String
}
User = {
id: ObjectId
skills: [ObjectId]
}
在前端,用户可以通过搜索标题来添加Skill
。因此,我通过{id: 1,title: "text"}
对技能收集进行了索引。我想知道在将文本索引与数字索引结合在一起时排序是否重要。
解决方法
是的,这很重要。直接来自docs:
复合索引中列出的字段的顺序很重要。索引将包含对文档的引用,这些文档首先按项目字段的值排序,然后在项目字段的每个值内,按库存字段的值排序。有关更多信息,请参见排序顺序。
在当前结构中,如果仅查询title
字段而没有限制(无查询)的id
字段,则将无法使用索引。
是的,这有很大的不同,documentation about composite text indexes说
- 如果复合文本索引在文本索引键之前包含键,则要执行
$text
搜索,查询谓词必须在前面的键上包含相等匹配条件。
这意味着如果您执行{id: 1,title: 'text'}
,并且您还将搜索限制在单个 id内,则只能在标题上使用文本索引。
如果您执行{title: 'text',id: 1}
,则可以单独对标题进行文本搜索,也可以对其进行进一步的id约束,或者为文本搜索结果检索匹配的id。
确定要在索引中使用id
列吗?为什么不只是文本索引?