2016-02-09 3 views
0

Мы используем mongodb $ или оператор для фильтрации данных. Следующий запрос не использует ни один из индексов.

{ 
    data.username: "xxxxx", 
    $or: [ 
     { 
      data.timestamp: { 
       $gte: 1428405480000, 
       $lte: 1428406380000 
      }, 
      data.finished: false 
     }, 
     { 
      data.timestamp: { 
       $gte: 1428319980000, 
       $lte: 1428406380000 
      }, 
      data.finished: true 
     } 
    ] 
} 

Мы определили следующие индексы по коллекции:

INDEX1

{ 
    "data.username" : 1.0, 
    "data.uuid" : 1.0, 
    "data.timestamp" : -1.0 
} 

index2

{ 
    "data.username" : 1.0, 
    "data.userid" : 1.0, 
    "data.timestamp" : 1.0, 
    "data.finished" : 1.0 
} 

index3

{ 
    "data.username" : 1.0, 
    "data.timestamp" : 1.0, 
    "data.finished" : 1.0 
} 

index4

{ 
    "data.username" : 1, 
    "data.finished" : 1, 
    "data.timestamp" : 1 
} 

Ни один из вышеупомянутых индексов не используется MongoDB. Мы используем механизм хранения WiredTiger. Результат команды объяснения возвращает explain.queryPlanner. indexFilterSet = ложь

+0

И вопрос ?? – chridam

+2

В этом документе есть специальный раздел в документах (https://docs.mongodb.org/manual/reference/operator/query/or/#or-clauses-and-indexes). Пробовали ли вы «Чтобы поддержать этот запрос, а не сложный индекс, вы бы создали один индекс по количеству и другому индексу цены»? – joao

ответ

0

Как было отмечено Joao, то documentatation утверждает, что при оценке положения в $ или выражение, MongoDB либо выполняет сбор сканирования или, если все пункты поддерживаются индексы, MongoDB выполняет сканирование индексов. То есть для MongoDB использовать индексы для оценки $ или выражения, все предложения в выражении $ или expression должны поддерживаться индексами. В противном случае MongoDB выполнит сканирование коллекции.

Короче говоря, вы должны добавить следующие показатели:

{ 
    "data.username" : 1.0 
} 

{ 
    "data.userid" : 1.0 
} 

{ 
    "data.timestamp" : 1.0 
} 

{ 
    "data.finished" : 1.0 
} 
+0

Большое спасибо. Это решило мою проблему. –

Смежные вопросы