【问题标题】:Optimizing mongo queries - _id or traverse whole collection优化 mongo 查询 - _id 或遍历整个集合
【发布时间】:2020-09-16 06:56:52
【问题描述】:

我正在为一个项目使用 mongodb。需要知道哪个是更好的查询实现。

假设我必须根据条件(不是 id)从总共 1000 个文档中搜索 10 个文档。

  1. 最好使用文档 _id 进行查询(在将所需的 id 存储在另一个集合中之后,通过在插入完成时检查条件)
  2. 是不是最好遍历所有的文档,使用条件得到需要的文档

这里的主要目的是将文档分成不同的类别并显示属于特定类别的文档。那么存储属于每个类别的文档的 id 还是通过遍历所有文档来搜索该类别中的文档?

我听说 mongodb 使用散列索引(所以感觉选项 1 会更快),但我找不到任何相关信息。因此,关于文档存储和查询的简短描述也很好。

【问题讨论】:

  • 最佳查询方式取决于条件的性质和文档的内容。我们可以举个例子吗?
  • 是的,我有一个包含酒店名称的文档,我想搜索所有中国餐馆。最好在每个文档中使用 type:"Chinese" 或 Chinese:"no" 之类的内容,或者保留另一个集合类别并使用 Chinese:[id1, id2, id3...]
  • 只想知道是使用一些 for 循环搜索每个 Id 更好还是遍历整个餐厅集合并获取满足条件的每个餐厅。

标签: mongodb indexing


【解决方案1】:

查询美食类型示例的最佳方法是将餐厅提供的食物存储在字符串或对象数组中,并为该字段编制索引。

例如:

{
  name: "International House"
  cuisine: [
    { name: "Chinese", subtype: "Kowloon"},
    { name: "Japanese", subtype: "Yakitori"},
    { name: "American", subtype: "TexMex" }
  ]
}

然后在{ "cuisine.name": 1 }上创建一个索引。

当您需要查找所有供应中餐的餐厅时,查询:

db.collection.find({"cuisine.name":"Chinese")

将使用该索引,并且只扫描匹配的文档。

【讨论】:

  • 那么,选项 2 ryt?你能否解释一下为什么它比第一个更受欢迎?会有很大帮助?
  • 不是,这是选项3。如果在包含数据的字段上创建索引,它不会遍历所有文档,也不会使用_id索引。
  • 哦,我认为浏览所有文档需要线性时间。那么mongodb中的存储是如何实现这样的查询的呢?有什么想法吗?
  • 关键是创建附加索引,它本质上是从特定字段值到文档的映射。当您查询时,mongodb 可以扫描索引以找到您要查找的值,然后仅获取包含该值的文档。
猜你喜欢
  • 2014-10-22
  • 2023-03-22
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 2013-02-22
  • 1970-01-01
相关资源
最近更新 更多