首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB改进$not和$elemMatch性能

MongoDB改进$not和$elemMatch性能
EN

Stack Overflow用户
提问于 2022-06-10 20:36:49
回答 1查看 47关注 0票数 1

假设DB包含数万个具有以下结构的文档

代码语言:javascript
运行
复制
{
  _id: ObjectId("5ef053e819aaa00013a2bd69"),
  approvers: [
    {
      type: "ONE",
      details: {
        name: "NameOne",
        surname: "SurnameOne"
      }
    },
    {
      type: "TWO",
      details: {
        name: "NameTwo",
        surname: "SurnameTwo"
      }
    },
    {
      type: "THREE",
      // details field is missing
    }

  ]
}

我只需要选择这样的文档,其中没有类型的审批人“2”或“1”,或者审批者缺少details

我有一个想法把$not$elemMatch结合起来

代码语言:javascript
运行
复制
{
  $or: [
    {
      "approvers.type": {
        $not: {
          $in: ["ONE", "TWO"]
        }
      }
    }, 
   {
      approvers: {
        $not: {
          $elemMatch: {
            type: { $in: ["ONE", "TWO"]},
            details: {$exists: true}
          }
        }
      }
    }
  ]
}

该查询工作正常,但由于没有使用索引,所以它非常无效。根据我的理解,DB引擎必须进行完整的收集扫描,并且在每个文档中检查所有的数组元素。

实际上,集合有75k个记录,每个approvers数组最多可以容纳3个元素。

是否有任何“诡计”使它更有效,或者唯一的选择是改变数据结构?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-11 03:02:32

这是分开收集有益的地方。

假设以上是项目,则可以采用不同的结构。

代码语言:javascript
运行
复制
//approvals
[{
  _id: ObjectId
  projectId: ObjectId // etc the _id in your code
  type: "one",
  details: "some stuff"
},
{
  _id: ObjectId
  projectId: ObjectId // etc the _id in your code
  type: "two",
  details: "some stuff"
},
{
  _id: ObjectId
  projectId: ObjectId // etc the _id in your code
  type: "three",
  details: "some stuff"
}]

然后,在使用projectId检索相关项目之前,您可以获得$ne“一”、“二”类型的所有$in。这也应该可以通过聚合来实现,尽管我从未尝试过。

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

https://stackoverflow.com/questions/72579597

复制
相关文章

相似问题

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