mongodb创建准确的指数

时间:2014-10-08 09:42:39

标签: mongodb indexing database

我想为以下查询创建一个mongodb索引:

{
  "$and": [
    {
      "$or": [
        {
          "connector_name": {
            "$options": "i",
            "$regex": "plop"
          }
        },
        {
          "connector": {
            "$options": "i",
            "$regex": "plop"
          }
        },
        {
          "component": {
            "$options": "i",
            "$regex": "plop"
          }
        },
        {
          "resource": {
            "$options": "i",
            "$regex": "plop"
          }
        },
        {
          "domain": {
            "$options": "i",
            "$regex": "plop"
          }
        },
        {
          "perimeter": {
            "$options": "i",
            "$regex": "plop"
          }
        }
      ]
    },
    {
      "$or": [
        {
          "event_type": {
            "$eq": "check"
          }
        }
      ]
    }
  ]
}

我尝试了以下索引创建失败:

第一个索引尝试:

db.events.ensureIndex({'event_type': 1});
db.events.ensureIndex({'connector_name': 1});
db.events.ensureIndex({'connector': 1});
db.events.ensureIndex({'component': 1});
db.events.ensureIndex({'resource': 1});
db.events.ensureIndex({'domain': 1});
db.events.ensureIndex({'perimeter': 1});

第二个索引尝试:

db.events.ensureIndex({'event_type': 1, 'connector_name': 1});
db.events.ensureIndex({'event_type': 1, 'connector': 1});
db.events.ensureIndex({'event_type': 1, 'component': 1});
db.events.ensureIndex({'event_type': 1, 'resource': 1});
db.events.ensureIndex({'event_type': 1, 'domain': 1});
db.events.ensureIndex({'event_type': 1, 'perimeter': 1});

第三个索引尝试:

db.events.ensureIndex(
{
    'event_type': 1,
    'connector_name': 1,
    'connector': 1,
    'component': 1,
    'resource': 1,
    'domain': 1,
    'perimeter': 1,
})

每次和mongo explain query之后,我都会看到" indexOnly"和" nscanned"这些字段意味着(据我所知)我的索引的良好mongo使用。但是,到目前为止,结果很差,我的查询仍然没有使用索引。经过我所有的尝试,我仍然不明白我对mongodb索引系统的错误。

1 个答案:

答案 0 :(得分:1)

db.collection.ensureIndex({connectorname:"text",connector:"text",component:"text"...})

在字段上创建文本索引。然后,您可以像

一样查询
db.collection.find({$or:[{$text:{$search:"plop"},{event_type:"check"}]})

将返回在创建文本索引的字段中包含搜索词的所有文档,或者包含event_type ==" check"。

有关详细信息,请参阅the MongoDB docs on "Text Indices"