为什么我的 mongodb 查询使用带有复合文本索引的内存排序

问题描述 投票:0回答:1

我正在尝试使用复合文本索引在 mongodb 上查询,如下所示

index : {name : 'text' , createdAt:'-1'}

这将为 name 和createdAt 字段创建复合索引,但是当我尝试查询这些字段时,它在内存排序中使用,尽管我在复合索引中定义了排序顺序

db.table.find({$text:{$search:"text"}}).sort({createdAt : -1})

我检查了 mongodb 文档,但没有找到任何与我的用例匹配的用例。我期望使用上述复合索引的文本搜索来删除内存排序。

node.js mongodb sorting mongoose full-text-search
1个回答
1
投票

在 MongoDB 中,当您使用包含文本索引字段和另一个字段的复合索引时,在执行文本搜索时,复合索引中指定的排序顺序不会直接用于排序。文本搜索查询有其自己的内部排序要求,如果查询条件需要,MongoDB 可能会诉诸内存排序。

在您的情况下,您在 { name: 'text',createdAt: -1 } 上有一个复合文本索引。但是,当您使用 $text 执行文本搜索查询并按 createAt 排序时,如果文本搜索分数或其他条件影响排序顺序,MongoDB 可能会诉诸内存排序。

要优化查询并减少内存中排序的可能性,您可以考虑以下事项:

您可以为文本搜索和排序字段创建单独的索引,而不是复合索引。例如:

db.table.createIndex({ name: 'text' });
db.table.createIndex({ createdAt: -1 });

或者您可以使用投影参数将返回的字段限制为仅需要的字段。这在某些情况下可能会有所帮助:

db.table.find(
  { $text: { $search: "text" } },
  { _id: 0, name: 1, createdAt: 1 }
).sort({ createdAt: -1 });
© www.soinside.com 2019 - 2024. All rights reserved.