2016-09-18 2 views
2

Я работаю над функцией поиска, в которой я должен искать несколько полей в документах.Индексирование в документах мангуста

У меня есть следующие случаи:

1) Получить все документы, где field1, field2, field3, Field4 соответствует строке (Найяр)

2) Получить все документы, где поле1, поле2, поле3, Field4 спичек строка (nayyar) И пол должен быть (входное значение) или «N/A».

3) Получить все документы, в которых поле1, поле2, поле3, поле4 соответствует строке (nayyar). И возраст должен быть между ageHigh и ageLow И должен быть равен (входное значение) или «N/A».

4) Получить все документы, где поле1, поле2, поле3, поле4 соответствует строке (nayyar) И возраст должен быть между ageHigh и ageLow И должен быть равен (входное значение) или 'N/A' AND ArrayField в 'atoz ».

var Schema = new Schema({ 
lowAge   : { 
         type: Number, 
         default: 0 
        }, 
highAge   : { 
         type: Number, 
         default: 0 
        }, 
gender   : { 
         type: String, 
         default: 'N/A' 
        }, 
field1   : { 
         type: String 
        }, 
field2   : { 
         type: String 
        }, 
field3   : { 
         type: String 
        }, 
field4   : { 
         type: String 
        }, 
arrayField  : { 
         type: [String] 
        } 
}); 


Schema.index({field1:1, field2:1, field3:1, field4:1}); 
Schema.index({field1:1, field2:1, field3:1, field4:1, arrayField:1,lowAge:1, highAge:1, gender:1,}); 

Это правильный способ индексирования?

ответ

2

Во-первых, идея создания индекса на полях выглядит хорошо. Однако создание индекса во всех возможных полях, используемых в запросе, выглядит неверно.

Все запросы, перечисленные в сообщении, содержат четыре поля. Если вы создадите составной индекс для всех этих 4 полей, я думаю, этого должно быть достаточно.

Кроме того, вы определяете индекс на уровне схемы. Когда приложение запускается, Mongoose автоматически вызывает securityIndex для каждого определенного индекса в вашей схеме. Это может повлиять на производительность.

Вам необходимо учитывать следующее: -

1) индекс одного поля, т.е. создание четырех индексов один на каждое поле.

Пример:

db.collection.createIndex({field1 : 1}); 

Go для этой опции, если вам нужно будет найти документы, либо поле1, field2, field3 или Field4 или комбинации одного или нескольких полей.

В этих вариантах индексы независимы. MongoDB всегда будет использовать индекс (т. Е. Один из индексов).

2) индекс соединения, т.е. создание одного индекса с четырьмя полями

Пример:

db.collection.createIndex({field1 : 1, field2 : 1, field3 : 1, field4 :1}); 

Go для этой опции, если вы бы field1 всегда.

Если у вас нет поля 1 в любом сценарии, MongoDB не будет использовать индекс.

+0

Я собираюсь сделать коллекцию сразу, запустив скрипт. Таким образом, производительность при вставке данных не является проблемой. Да, во всех случаях у меня будет четыре поля, а в других случаях - разные. Оказывает ли это влияние на производительность Если я не добавляю индекс по возрасту и полу? и у меня будет 250,0000 документов, на которые я должен запросить. –

+0

После фильтрации данных по четырем полям я предполагаю, что у вас не будет 250,0000 документов.У вас будет небольшое подмножество общего числа, обычно MongoDB должен быть в порядке, чтобы справиться с этим без индекса. Я никогда не видел все поля в документе, добавленные в индекс. Определенно, это неверно. – notionquest

+0

Спасибо за ваше время и действительно это очень полезно для меня. –

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