Вопрос о 2dsphere как сложный индекс - PullRequest
1 голос
/ 28 января 2020

У меня есть коллекция с геопространственными данными (2dsphere) и временными метками (дата), которые мне нужно запросить на основе местоположения (т. Е. Геопространственных) и времени (т. Е. Даты).

Я создал составной индекс с геопространственные и время как индикаторы. Однако, когда я выполняю запрос (т.е. на основе местоположения и времени), планировщик запросов говорит, что он выполняет COLLSCAN.

Кроме того, когда я добавляю индекс только со временем, он использует этот индекс (ie. IXSCAN с индекс отметки времени).

Я немного запутался, я читал, что вы должны иметь возможность использовать 2dsphere и отметку времени в качестве составного индекса для быстрого поиска на основе местоположения и времени (например, Индексирование MongoDB: Несколько в одном поле против одного соединения? ).

Итак, я предполагаю, что мой вопрос заключается в том, возможно ли использовать 2dsphere в качестве составного индекса? Индекс 2dsphere ведет себя так же, как и другие типы индексов (например, целые числа, даты и т. Д. 1032 *), или есть большие различия? Например, предположим, что у нас есть признаки "timestamp", "geospatial" (в указанном порядке индексов). Могу ли я запрашивать только на основе timestamp (так как это первый индекс)?

Ссылка на документы о 2dsphere: https://docs.mongodb.com/manual/core/2dsphere/.

Заранее спасибо.

Пример данных:

{
    "_id" : ObjectId("5e300c9673f256100d5ca0b2"),
    "geometry" : {
        "type" : "Point",
        "coordinates" : [
            18.2,
            59.8
        ]
    },
    "properties" : {
        "@timestamp" : ISODate("2019-01-01T12:01:00.158Z")
    }
}
{
    "_id" : ObjectId("5e300c9673f256100d5ca0b3"),
    "geometry" : {
        "type" : "Point",
        "coordinates" : [
            12.3,
            52.4
        ]
    },
    "properties" : {
        "@timestamp" : ISODate("2019-01-01T12:10:00.158Z")
    }
}
{
    "_id" : ObjectId("5e300c9673f256100d5ca0b4"),
    "geometry" : {
        "type" : "Point",
        "coordinates" : [
            28.8,
            50.2
        ]
    },
    "properties" : {
        "@timestamp" : ISODate("2019-01-01T12:50:00.158Z")
    }
}
{
    "_id" : ObjectId("5e300c9673f256100d5ca0b5"),
    "geometry" : {
        "type" : "Point",
        "coordinates" : [
            28.8,
            50.2
        ]
    },
    "properties" : {
        "@timestamp" : ISODate("2019-01-01T13:50:00.158Z")
    }
}
{
    "_id" : ObjectId("5e300c9673f256100d5ca0af"),
    "geometry" : {
        "type" : "Point",
        "coordinates" : [
            -102.5,
            22.6
        ]
    },
    "properties" : {
        "@timestamp" : ISODate("2019-01-01T12:01:00.158Z")
    }
}
{
    "_id" : ObjectId("5e300c9673f256100d5ca0b0"),
    "geometry" : {
        "type" : "Point",
        "coordinates" : [
            -104.5,
            21
        ]
    },
    "properties" : {
        "@timestamp" : ISODate("2019-01-01T12:10:00.158Z")
    }
}
{
    "_id" : ObjectId("5e300c9673f256100d5ca0b1"),
    "geometry" : {
        "type" : "Point",
        "coordinates" : [
            -104.5,
            21
        ]
    },
    "properties" : {
        "@timestamp" : ISODate("2019-01-01T13:10:00.158Z")
    }
}

Индекс:

{
    "v" : 2,
    "key" : {
        "_id" : 1
    },
    "name" : "_id_",
    "ns" : "test_database.map_reduce_test_data"
},
{
    "v" : 2,
    "key" : {
        "properties.@timestamp" : -1,
        "geometry" : "2dsphere"
    },
    "name" : "properties.@timestamp_-1_geometry_2dsphere",
    "ns" : "test_database.map_reduce_test_data",
    "2dsphereIndexVersion" : 3
}

Запрос:

db.map_reduce_test_data.find({"properties.@timestamp": { $gt: new Date("2019-01-01T12:00:00Z"), $lt: new Date("2019-01-01T13:00:00Z") }})

Объяснить результат:

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test_database.map_reduce_test_data",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : [
                {
                    "properties.@timestamp" : {
                        "$lt" : ISODate("2019-01-01T13:00:00Z")
                    }
                },
                {
                    "properties.@timestamp" : {
                        "$gt" : ISODate("2019-01-01T12:00:00Z")
                    }
                }
            ]
        },
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "$and" : [
                    {
                        "properties.@timestamp" : {
                            "$lt" : ISODate("2019-01-01T13:00:00Z")
                        }
                    },
                    {
                        "properties.@timestamp" : {
                            "$gt" : ISODate("2019-01-01T12:00:00Z")
                        }
                    }
                ]
            },
            "direction" : "forward"
        },
        "rejectedPlans" : [ ]
    },
    "ok" : 1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...