Геопространственный индекс MongoDB на $center

Схема сбора

{
    "_id" : ObjectId("5d3562bf1b48d90ea4b06a74"),
    "name" : "19",
    "location" : {
        "type" : "Point",
        "coordinates" : [
            50.0480208,
            30.5239127
        ]
    }
}

Индексы

> db.places.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.places"
    },
    {
        "v" : 2,
        "key" : {
            "location" : "2dsphere"
        },
        "name" : "location_2dsphere",
        "ns" : "test.places",
        "2dsphereIndexVersion" : 3
    }

В коллекции хранится 2 миллиона документов.

Сначала я запустил такой запрос.

db.places.find({ location: {$geoWithin: { $center: [[60.0478308, 40.5237227], 10] } }})

Но это занимает 2 секунды. Поэтому я проверяю запрос с помощью объяснения ().

> db.places.find({ location: {$geoWithin: { $center: [[60.0478308, 40.5237227], 10] } }}).explain('executionStats')
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.places",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "location" : {
                "$geoWithin" : {
                    "$center" : [
                        [
                            60.0478308,
                            40.5237227
                        ],
                        10
                    ]
                }
            }
        },
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "location" : {
                    "$geoWithin" : {
                        "$center" : [
                            [
                                60.0478308,
                                40.5237227
                            ],
                            10
                        ]
                    }
                }
            },
            "direction" : "forward"
        },
        "rejectedPlans" : [ ]
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 1414213,
        "executionTimeMillis" : 2093,
        "totalKeysExamined" : 0,
        "totalDocsExamined" : 2000000,
        "executionStages" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "location" : {
                    "$geoWithin" : {
                        "$center" : [
                            [
                                60.0478308,
                                40.5237227
                            ],
                            10
                        ]
                    }
                }
            },
            "nReturned" : 1414213,
            "executionTimeMillisEstimate" : 1893,
            "works" : 2000002,
            "advanced" : 1414213,
            "needTime" : 585788,
            "needYield" : 0,
            "saveState" : 15681,
            "restoreState" : 15681,
            "isEOF" : 1,
            "invalidates" : 0,
            "direction" : "forward",
            "docsExamined" : 2000000
        }
    },
    "serverInfo" : {
        "host" : "Johnui-iMac",
        "port" : 27017,
        "version" : "4.0.3",
        "gitVersion" : "7ea530946fa7880364d88c8d8b6026bbc9ffa48c"
    },
    "ok" : 1
}

Вы знаете, что этап запроса COLLSCAN,

Интересно, я уже создал индекс для location поля, но, кажется, не работает.

Поэтому я создаю больше индексов.

        "v" : 2,
        "key" : {
            "location.coordinates" : 1
        },
        "name" : "location.coordinates_1",
        "ns" : "test.places"
    },
    {
        "v" : 2,
        "key" : {
            "location" : 1
        },
        "name" : "location_1",
        "ns" : "test.places"
    }

Но это тоже не работает.

Есть ли проблема в моей конфигурации индекса?

1 ответ

Вы, кажется, создали 2dsphere Индекс вашего местоположения, но документы MongoDB на $centre указать что:

Только 2-й геопространственный индекс поддерживает $center.

Поэтому я предлагаю вам создать 2d указатель на поле местоположения, и сканирование будет выполняться с использованием этого указателя

Другие вопросы по тегам