Я предлагаю вам посмотреть / использовать $ geoWithin вместо $ nearSphere (если ваш сценарий использования соответствует). $ nearsphere сортирует результат по возрастанию расстояния от центральной точки, а $ inside - нет. Если в вашем случае вам не нужна сортировка по расстоянию или вы сортируете по любому другому полю, тогда нет смысла использовать $ nearsphere.
Также для $ geoWithin индекс 2dsphere не обязателен, хотя необходим для производительности. Так что, если в вашем запросе, если другие условия сопоставления оставляют очень маленький набор результатов, оставленных для фильтрации для сопоставления местоположения, то индекс в поле местоположения совсем не нужен Моя цель - создать индекс только для тех полей, которые имеют очень большую мощность, нет смысла добавлять все ваши поля в составной индекс. В настоящее время у вас есть 7 полей в вашем составном индексе.
1) Используйте запрос объяснения mongo, чтобы проверить, используется ли индекс или нет (а также поделиться планом выполнения здесь). Индекс 2dsphere поддерживает данные, хранящиеся в виде объектов GeoJSON и устаревших координатных пар. Для устаревших координатных пар индекс преобразует данные в GeoJSON Point.
2) Для оптимизации индекса удаляет поля из индекса с низким количеством элементов. Порядок полей в составном индексе имеет значение, поэтому рассортируйте их по тому же факту. Я не думаю (не могу комментировать, поскольку я не знаю сценарий использования), в запросе есть место для улучшения. Кроме того, вы можете удалить userId из индекса, $ nin не очень хорошо работает с составным индексом.
П.С .: Количество элементов: количество элементов набора. Например. поле «Пол» может иметь только два поля «М» и «F», таким образом, очень низкая мощность. В то время как поле «Мобильный» имеет очень четкие числа, следовательно, очень высокая мощность. Если вы используете 2dsphere index в составном индексе, используйте его в первую очередь.
Попробуйте разные составные индексы с не более чем 3 полями.