2015-11-18 3 views
1

соответствующих полей документов в моей коллекции является следующим:MongoDB запрос по одному индексу, сортировок по antoher

{ 
    point: { 
    type: Point, 
    coordinates: [15.6446464, 45.231323] 
    } 
    score: 24 
} 

У меня есть 2dsphere индекса на point и «нормальный», нисходящий индекс по score. Я хочу, чтобы выполнить следующий запрос:

db.properties.find({point: {$geoWithin: <some polygon> }}).sort({score: -1}).limit(2000) 

Есть ли способ сделать Монго использовать индекс point для find части, а затем индекс score для сортировки?

В коллекции имеется около 700 тыс. Документов, часть поиска может возвращать десятки тысяч документов, каждая из которых имеет до МБ.

Текущая проблема заключается в том, что при использовании индекса point размер возвращаемой коллекции слишком велик для сортировки в памяти. При использовании индекса score запрос выполняется слишком медленно из-за последовательного сканирования по координатам.

ответ

0

При выполнении вашего текущего запроса MongoDB будет использовать индекс только на point. После запуска find у вас будет подмножество данных, и поэтому Mongo больше не сможет использовать индекс на score. Вместо этого вы можете создать составной индекс на point и score с индексом score, индексированным в порядке убывания. Несмотря на то, что первые значения уникальны, это помогает ускорить сортировку, поскольку MongoDB может использовать индекс для сортировки по score, а не для сканирования всего документа (размер которого может быть до размера MB).

Сводный индекс следует за общим правилом при индексировании. В целом порядок индекса должен быть:

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

Однако, согласно вашему комментарию, этот составной индекс не очень быстрый, и это говорит о том, что MongoDB не может загрузить весь индекс в память. Сколько RAM вы выделили для MongoDB? Есть ли шанс, что вы можете это увеличить?

+0

Я пробовал делать составной индекс, но это не поможет мне, потому что 'point' уникален почти для каждого документа, поэтому' score' будет технически случайным. –

+0

Вы говорите, что использование индекса для сортировки подмножества данных технически невозможно? У меня было такое чувство, но я не мог найти объяснения. –

+0

Нет, вы не можете использовать отдельный индекс для подмножества данных. Что касается составного ключа, испытали ли вы это? Я ожидал бы, что составной ключ будет самым быстрым в этом сценарии. – Jaco

Смежные вопросы