我想为以下查询创建一个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索引系统的错误。
答案 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"。