Использует ли nearSphere 2dsphere с устаревшими парами координат? - PullRequest
0 голосов
/ 11 июля 2019

Запрос mongodb использует поле местоположения и несколько других полей:

{
    "location": {
        "$nearSphere": ["<val>"],
        "$maxDistance": "<val>"
    },
    "userId": {
        "$nin": ["<vals>"]
    },
    "date": {
        "$gte": "<val>"
    },    
    "age": {
        "$in": ["<vals>"]
    },
    "property1": {
        "$in": ["<vals>"]
    },
    "weight": {
        "$in": ["<vals>"]
    }
}

Поле местоположения использует устаревшие пары координат .

A 2dsphere индекссоздан для использования нескольких полей.

В отличие от составного 2d-индекса, который может ссылаться на одно поле местоположения и одно другое поле, составной 2dsphere-индекс может ссылаться на несколько полей местоположения и не-местоположения.

{
    "count": 1,
    "height": 1,
    "weight": 1,
    "age": 1,
    "date": -1,
    "location": "2dsphere",
    "userId": 1
}

документы говорят:

$ nearSphere требуется геопространственный индекс:

  • 2-сферический индекс для определенных данных местоположениякак GeoJSON указывает
  • 2d индекс для данных о местоположении, определенных как устаревшие пары координат.Чтобы использовать двухмерный индекс для точек GeoJSON, создайте индекс в поле координат объекта GeoJSON.

И здесь :

Поля с индексами 2dsphere должны содержать данные геометрии в виде пар координат или данных GeoJSON.

1) Будет ли индекс использоваться вообще?Из документов я понимаю, что индекс 2dsphere требует, чтобы данные о местоположении были объектом GeoJSON, а не устаревшими парами координат.С другой стороны, индекс 2dsphere можно построить также из устаревших пар координат.

2) Можно ли оптимизировать индекс (или запрос)?

1 Ответ

0 голосов
/ 11 июля 2019

Я предлагаю вам посмотреть / использовать $ geoWithin вместо $ nearSphere (если ваш сценарий использования соответствует). $ nearsphere сортирует результат по возрастанию расстояния от центральной точки, а $ inside - нет. Если в вашем случае вам не нужна сортировка по расстоянию или вы сортируете по любому другому полю, тогда нет смысла использовать $ nearsphere.

Также для $ geoWithin индекс 2dsphere не обязателен, хотя необходим для производительности. Так что, если в вашем запросе, если другие условия сопоставления оставляют очень маленький набор результатов, оставленных для фильтрации для сопоставления местоположения, то индекс в поле местоположения совсем не нужен Моя цель - создать индекс только для тех полей, которые имеют очень большую мощность, нет смысла добавлять все ваши поля в составной индекс. В настоящее время у вас есть 7 полей в вашем составном индексе.

1) Используйте запрос объяснения mongo, чтобы проверить, используется ли индекс или нет (а также поделиться планом выполнения здесь). Индекс 2dsphere поддерживает данные, хранящиеся в виде объектов GeoJSON и устаревших координатных пар. Для устаревших координатных пар индекс преобразует данные в GeoJSON Point.

2) Для оптимизации индекса удаляет поля из индекса с низким количеством элементов. Порядок полей в составном индексе имеет значение, поэтому рассортируйте их по тому же факту. Я не думаю (не могу комментировать, поскольку я не знаю сценарий использования), в запросе есть место для улучшения. Кроме того, вы можете удалить userId из индекса, $ nin не очень хорошо работает с составным индексом.

П.С .: Количество элементов: количество элементов набора. Например. поле «Пол» может иметь только два поля «М» и «F», таким образом, очень низкая мощность. В то время как поле «Мобильный» имеет очень четкие числа, следовательно, очень высокая мощность. Если вы используете 2dsphere index в составном индексе, используйте его в первую очередь.

Попробуйте разные составные индексы с не более чем 3 полями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...