Mongo PHP - 找到$ regex Timing Out的标准

时间:2016-07-19 21:23:56

标签: php mongodb

我正在对我的数据集执行MongoDB find()。我的数据集总共有超过一百万个文档,索引尽可能多。我已经确信该系列本身尽可能优化。

我的应用可让您对该集合进行高级搜索。我刚刚设法让一个新的功能工作,让你运行一个通用"不能包含"过滤您已经很复杂的搜索过滤器。问题是搜索现在超过了Mongo的30秒限制!没有一般"不得包含"过滤器,我的示例搜索大约需要5秒钟。如果我减少了所涉及的密钥,搜索会及时回复。

搜索的目标是返回不包含" ARSB"在任何指定的键中(每个文档中总是有大量其他无关键)。我无法在每个密钥上运行$regex的原因是,如果您这样做,搜索不会返回缺少任何一个密钥的文档。

该应用在PHP脚本中运行find()查询。这是慢搜索$criteria

{
  "$and": [
    {
      "$or": [
        {
          "columnOne": {
            "$regex": "^((?!ARSB).)*$",
            "$options": "-i"
          }
        },
        {
          "columnOne": {
            "$exists": false
          }
        }
      ]
    },
    {
      "$or": [
        {
          "secondColumn": {
            "$regex": "^((?!ARSB).)*$",
            "$options": "-i"
          }
        },
        {
          "secondColumn": {
            "$exists": false
          }
        }
      ]
    },
    {
      "$or": [
        {
          "finalColumn": {
            "$regex": "^((?!ARSB).)*$",
            "$options": "-i"
          }
        },
        {
          "finalColumn": {
            "$exists": false
          }
        }
      ]
    },
    {
      "$or": [
        {
          "columnOne": {
            "$exists": true
          }
        },
        {
          "secondColumn": {
            "$exists": true
          }
        },
        {
          "finalColumn": {
            "$exists": true
          }
        }
      ]
    }
  ]
}

是什么让这种搜索变得如此之慢?有什么方法吗?

0 个答案:

没有答案