2015-10-09 2 views
0

У меня есть следующая структура объекта в моей базе данных.Mongo составной массив Индекс не используется

{ 
    "_id": 1234, 
    "dateTime": ISODate("2015-09-28T02:15:00Z"), 
    "tags":[{ 
    "_id": 5678, 
    "name":{ 
     "short": "GOT", 
     "long" : "Game of Thrones" 
    } 
    },{ 
    "_id": 9101, 
    "name":{ 
     "short": "Dragons", 
     "long" : "Huge Dragons" 
    } 
    }] 
} 

Я пытаюсь запросить с помощью:

db.collection.find ({ DATETIME: {$ GTE: новая Дата (1443398000000), $ л: новая Дата (1443484740000)}, "tags._id": "d8408d19-48e4-36a0-aa23-55cd8c8415f6"}})

Я создал индекс:

{dateTime: 1, "tags._id": 1}

Однако при выполнении запроса с помощью функции объяснения() он никогда не использует этот индекс.

Я попытался перевернуть индекс в обратном направлении и заказать мой запрос, но это не помогло.

У меня есть около 500 000 документов в моей базе данных.

Надеюсь, кто-то может помочь.

+0

Можете ли вы включить вывод '.explain (true)' для вашего запроса? Кроме того, какую конкретную версию MongoDB вы используете? – Stennie

ответ

0

Я просто запрос, как этот

> db.comp.find({dateTime:{"$gte":new Date(12345),"$lte":new Date(999999999)},"ta 
gs._id":5678}).explain() 

и здесь выход

{ 
     "queryPlanner" : { 
       "plannerVersion" : 1, 
       "namespace" : "test.comp", 
       "indexFilterSet" : false, 
       "parsedQuery" : { 
         "$and" : [ 
           { 
             "tags._id" : { 
               "$eq" : 5678 
             } 
           }, 
           { 
             "dateTime" : { 
               "$lte" : ISODate("1970-01-12T13: 
46:39.999Z") 
             } 
           }, 
           { 
             "dateTime" : { 
               "$gte" : ISODate("1970-01-01T00: 
00:12.345Z") 
             } 
           } 
         ] 
       }, 
       "winningPlan" : { 
         "stage" : "KEEP_MUTATIONS", 
         "inputStage" : { 
           "stage" : "FETCH", 
           "filter" : { 
             "dateTime" : { 
               "$gte" : ISODate("1970-01-01T00: 
00:12.345Z") 
             } 
           }, 
           "inputStage" : { 
             "stage" : "IXSCAN", 
             "keyPattern" : { 
               "dateTime" : 1, 
               "tags._id" : 1 
             }, 
             "indexName" : "dateTime_1_tags._id_1", 
             "isMultiKey" : true, 
             "direction" : "forward", 
             "indexBounds" : { 
               "dateTime" : [ 
                 "(true, new Date(9999999 
99)]" 
               ], 
               "tags._id" : [ 
                 "[5678.0, 5678.0]" 
               ] 
             } 
           } 

Если вы видите "indexName" : "dateTime_1_tags._id_1" индекс используется.

Надеюсь, это поможет

+0

он не выбирает правильный запрос для меня, я получаю единственные ограничения индекса dateTime. Если я намекаю на использование правильного индекса, производительность очень плохая, 70 секунд для возврата – robinsio

+0

Я просто запускаю тот же запрос db.comp.find ({dateTime: {"$ gte": new Date (1443398000000), "$ lt" : new Date (1443484740000)}, "tags._id": 5678}). explain(), которые вы упомянули в вопросе, и получить тот же результат. Вы нашли пробел в этом запросе? –

+0

Нет, ваш запрос выглядит хорошо, насколько большой набор данных вы используете, попробуйте создать 500 000 документов со случайными отметками времени в поле dateTime. У меня также есть индекс в DateTime, это тот, который он выбирает – robinsio

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