【问题标题】:What do I do if I need more than one text index in a MongoDB collection?如果我在 MongoDB 集合中需要多个文本索引,我该怎么办?
【发布时间】:2021-01-19 13:07:22
【问题描述】:

我在 MongoDB 中名为 Messages 的集合包含大量带有消息内容和元数据的消息。每条消息都有一个SenderRecipient id,格式为UUID,又是string。在某些用例中,我需要使用相同的UUID 查询SenderRecipient,或仅使用Sender 或仅使用UUID 查询Recipient,或使用不同的UUIDs 查询两者。

我为第一种情况创建了一个文本索引,效果很好,但在其他情况下我也需要有效地搜索。你有什么建议?我应该调整/改变什么?我无法在同一个集合中定义任何其他文本索引,因为目前 MongoDB 中的文本索引数量存在限制。

注意:我最初不了解文本索引并尝试创建常规索引,但它们根本不被查询使用,即使我强制使用它们,查询仍然会扫描所有无用的文档。

【问题讨论】:

  • 这里根本不需要文本索引。它用于全文搜索。您需要一个常规索引。
  • 根据执行分析查询时不使用常规索引。
  • 这听起来不太可能。也许设置一个 mongo playground 来展示这种行为?
  • 我试过但无法创建索引。 mongoplayground.net/p/OnjLE72UMmr

标签: mongodb database-indexes


【解决方案1】:

根据操场,您需要使用this 来创建索引。

这就是它不使用索引的原因。

db.Message.createIndex({
  "Sender._id": 1
})

您也可以在 Recipient._id 上创建另一个索引。根据您的查询,它将使用索引。

我的意思是当您有两个单独的索引时,即一个在Sender_id,另一个在Recipient._id,当您查询时,将使用各自的索引。

而且你的用例不是全文搜索,所以不要为此使用文本索引。

【讨论】:

  • 抱歉,我仍然无法创建索引。 mongoplayground.net/p/xgVPLSTiSh_
  • 在 mongoplayground 上创建带有索引的集合似乎有特殊的语法。请参阅顶部栏中的“模板”下拉菜单。 @schlingel
  • 哦,好吧,没关系。看起来你不能在 mongoplayground 上同时做你自己的数据和索引。
  • 不不,我使用了特殊语法并创建了索引,但执行计划仍然说它使用了“collspan”:mongoplayground.net/p/KGD8CGr1pkc
  • @schlingel:您的查询错误。应该像this。我也尝试更改您的索引定义,但 mongoplayground 似乎仍然没有创建正确的索引(也许它只能创建文本索引?:shrug:)。它在我的本地主机上运行(执行计划显示 IXSCAN)
猜你喜欢
  • 2012-06-20
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多