我想創建以下查詢的MongoDB指數:蒙戈DB創建精確的指數
{
"$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」領域的良好蒙戈使用我的索引。但是,直到現在,結果很差,我的查詢仍然沒有使用索引。盡我所有的努力,我仍然不明白mongodb索引系統在哪裏出錯。
您正在使用不區分大小寫的正則表達式匹配,這將始終導致完整的索引掃描(最好)..並且使用'$或'子句,'nscanned'值將加起來到所有字段的基數你在比較。你能描述一下你實際需要搜索的東西 - 只是關鍵字,還是你需要在所有這些領域進行子串匹配? – Stennie 2014-10-08 10:00:41
使用此查詢,我想查找包含查詢值的所有匹配文檔,這裏是「plop」。現在,我會嘗試做一個區分大小寫的搜索,正如你所建議的,希望mongo能夠使用我的索引。實際上,這個查詢的目的是在我的文檔和搜索引擎中執行搜索。這就是爲什麼我的搜索是寬容的。 – utopman 2014-10-08 10:52:21
我改變了我的查詢,現在它看起來像 「$或」:[{ 「CONNECTOR_NAME」:{ 「$正則表達式」: 「/^Sphinx.*/」 }} ... 與我之前描述的第三個索引模型,但索引搜索仍然無法正常工作 – utopman 2014-10-08 11:17:59