首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB -是否可以创建索引来隔离文档键中的值,以便更快地进行搜索?

MongoDB -是否可以创建索引来隔离文档键中的值,以便更快地进行搜索?
EN

Stack Overflow用户
提问于 2020-11-15 08:27:08
回答 1查看 40关注 0票数 0

我将尽可能地简化它,因为数据库结构比这个复杂得多。

让我们假设存储在我的数据库中的文档具有以下结构:

代码语言:javascript
复制
[{
    
"items": [
      
"name1 , name2 , name3"
    ]
  },
  
{
    
"items": [
      
"name4 , name5 , name6 , name7"
    ]
}]

现在,为了找到一个'items‘键的值之一是"name6“的文档,我被迫使用如下所示的正则表达式:

代码语言:javascript
复制
db.collection.find({
  "items": {
    $regex: "name6",
    $options: "i"
  }
})

这是因为存储在'items‘键中的项值的长度是可变的,并且总是以逗号分隔的字符串形式存储(例如"name4,name5,name6,name7")

无论如何,这样的搜索会产生所需的结果,如下所示:

代码语言:javascript
复制
[
  {
    "_id": ObjectId("5a934e000102030405000001"),
    "items": [
      "name4 , name5 , name6 , name7"
    ]
  }
]

然而,虽然这种方法可以很好地处理我的数据库中的10000个文档,但对于100万个文档,它已经很慢(+10秒),并且数据库的预期大小超过10亿个文档;在这一点上,这种方法是不可用的。

我不能轻易改变JSON的结构,因为它来自第三方提供商。那么,我还能做什么来加快搜索速度呢?

我可以创建一个序列化索引来隔离这个特定文档关键字中的值吗?或者换句话说,我是否可以单独索引存储在“items”键中的值,就像指示索引为每个项创建单独的索引一样?还有更好的方法吗?

游乐场:https://mongoplayground.net/p/X_MZ37h5Qvd

EN

回答 1

Stack Overflow用户

发布于 2020-12-19 21:22:55

你可以创建一个text index on items字段,我还没有测试过,但我可以说文本搜索比$regex搜索和普通索引更好,

  • 创建文本索引:

代码语言:javascript
复制
db.collection.createIndex({ items: "text" });

  • 您的查询将是:

代码语言:javascript
复制
db.collection.find({
    $text: { $search: "name6" }
})

在实现之前先阅读text index restriction

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64840085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档