Запрос MongoDB с использованием неправильного индекса

#mongodb #mongodb-query

#mongodb #mongodb-запрос

Вопрос:

У меня есть коллекция со схемой, подобной:

 {
    _id: ObjectId,
    DatasetID: UUID,
    ID: UUID,
    Model.Footprint: GeoJSONType
    LastUpdateTimeMs: long
}
  

Я выдаю запрос, который выглядит следующим образом:

 db.getCollection('redacted').find(
{
    "DatasetID":UUID("redacted"),
    "Model.Footprint" : {
            $geoIntersects : {
                $geometry : {
                    type: "Polygon", 
                    coordinates: redacted
                }
            }
        },   
        "LastUpdateTimeMs" : { $gte: 1 }, 
        "_id": { $gt: ObjectId("redacted")},
})
.sort({ "_id": 1})
.limit(100)
  

И у меня есть следующие два индекса:

 {
    "DatasetID" : 1,
    "_id" : 1,
    "LastUpdateTimeMs" : 1,
    "Model.Footprint" : "2dsphere"
}

{
    "DatasetID" : 1,
    "ID" : 1
}
  

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

Я вставил выходные данные explain из-за максимальных ограничений на символы:https://pastebin.com/LcC3nYCg

[Редактировать]: Загружено правильное поясняющее сообщение.

Комментарии:

1. В вашем выводе explain говорится, что он использует первый индекс? Который был бы правильным индексом для использования из-за сортировки по _id. Пожалуйста, подтвердите, какой индекс, по вашему мнению, он использует и почему.

2. О черт, я вставил неправильное объяснение, это было с подсказкой () в запросе ._. Подождите

3. Хорошо, извините за это, объяснение без подсказки, указывающей, что делать, теперь завершено

4. @Dan при использовании hint() , видите ли вы улучшенную производительность запроса? Если да, то это потому, что любой индекс может ответить на запрос, но при выборе между ними, как известно, возникают некоторые проблемы, поскольку MongoDB не располагает полной информацией о вашей схеме, как в реляционной базе данных, и должен выбирать между ними (например, SERVER-20616 ). Если вам нужны оба индекса, то использование hint() является жизнеспособным обходным путем.

5. @KevinAdistambha Да, я специально создал индекс для этого запроса, но мне нужен другой для других запросов. Я боялся, что ответом будет требование «подсказка», поскольку я читал, что у преобразователя индекса запроса возникают некоторые проблемы при выполнении сортировки. Я просто надеялся, что пропустил что-то простое, но, похоже, мне просто нужно переписать свой код, чтобы использовать подсказки для каждого запроса.