【问题标题】:What is the best index to create for such a collection in MongoDB?在 MongoDB 中为此类集合创建的最佳索引是什么?
【发布时间】:2021-09-06 08:21:53
【问题描述】:

我有一个包含这样的文档的集合:

{
  "_id":{
    "$oid":"60c5316cbc885e00c6e5abeb"
  },
  "name":"<name>",
  "addedAt":{
    "date":{
      "$date":"2021-06-12T22:13:00.316Z"
    },
    "timestamp":1623535980.316648
  },
  "lastUsed":{
    "date":{
      "$date":"2021-06-22T14:17:23.339Z"
    },
    "timestamp":1624371443.339323
  },
  "connStr":"http://<user>:<pwd>@<host>:<port>",
  "resetIpUri":"http://<host>:<port>/api/changeIP?apiToken=<token>",
  "lastResetIP":1623535980.316648
}

还有非常简单的查询:

db.collection.find({connStr: <connStr>})
db.collection.find({}).sort({"lastUsed.timestamp": 1})

但我不太确定是否需要为字段conStr 使用文本索引,还是使用常规索引?我不明白文本索引是如何工作的,当我有任务通过其值查找文档时是否总是需要使用它们,如果是,我应该对整数或浮点字段使用文本索引吗?

【问题讨论】:

  • 您可以使用正常的升序或降序类型索引而不是测试索引,如果您要进行正常的匹配和排序操作,它应该可以正常工作。 db.collection.createIndex({connStr: 1})。如果您有其他疑问,请告诉我。
  • @hhharsha36 但是文本索引呢?我什么时候应该真正使用它们?例如,在我的文档中,如果此字段是文本索引,我的值为“A2131BBVYFTL212”,那么全文搜索是否会更快?
  • 我已经添加了一个答案,因为 cmets 有一个字数。希望对您有所帮助。
  • 您是否将密码以明文形式存储在数据库中?

标签: mongodb


【解决方案1】:

文本索引和常规索引完全不同,应该在完全不同的场景下使用。

如果出现以下情况,请使用普通索引:

您将匹配键的确切字符串值,或者您将对存储的字符串值使用Regex 操作。

正常索引就是您要查找的。​​p>

在以下情况下进行文本索引:

您希望为搜索目的提取键的值。例如词根like的词干有:likeslikedlikelyliking等,这些都是词根like的词干。

如果您希望键值可搜索,例如教科书名称或描述,您可以使用text 索引,并对键执行文本搜索,这将对所有单词进行词干搜索。

注意:我不是 MongoDB 文本索引专家,只是对它是什么有一个模糊的概念。欢迎任何更正和编辑。

【讨论】:

  • 所以我理解正确,如果我有一个值为A2131BBVYFTL212 的文档并且我想通过字段的完整值而不是部分来查找它,那么我不需要文本指数?当我需要按部分值进行搜索时,是否需要文本索引?
  • 即使您想搜索部分字符串(使用正则表达式),也不需要文本索引。普通索引可以正常工作。示例:如果您想通过A2131BBV 搜索值A2131BBVYFTL212db.col.find({/A2131BBV/}) 将使用索引扫描(如果应用)。仅当您正在构建电子商务网站时才使用文本索引,并且搜索查询将根据用户输入执行,这将存在不确定性、拼写错误并匹配文本的替代词干,例如 simple simply 等. 您正在寻找的内容在普通索引上可以正常工作。
  • 如果您还有其他疑问,请告诉我。我知道这很令人困惑,因为索引类型中的术语文本。
猜你喜欢
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多