ВведениеMongoDB очень медленно при использовании счета() на массиве
Моя коллекция насчитывает более 1 миллиона документов. Структура каждого документа одинакова и выглядит следующим образом:
{_id: "LiTC4psuoLWokMPmY", number: "12345", letter: "A", extra: [{eid:"jAHBSzCeK4SS9bShT", value: "Some text"}]}
Итак, как вы можете видеть, мой extra
поле представляет собой массив, который содержит небольшие объекты. Я пытаюсь вставить эти объекты как можно больше (пока я не приблизился к 16 МБ ограничения документа). И эти объекты обычно присутствуют в массиве extra
большинства документов в коллекциях. Поэтому у меня обычно есть сотни тысяч одинаковых объектов.
У меня есть индекс на eid
ключ в массиве extra
. Я создал этот индекс с помощью этого:
db.collectionName.createIndex({"extra.eid":1})
Проблема
Я хочу, чтобы подсчитать, сколько extra
поле объекта присутствует в коллекции. Я делаю это, используя это:
db.collectionName.find({extra: {eid: "jAHBSzCeK4SS9bShT"}}).count()
В начале запрос выше очень быстрый. Но всякий раз, когда массив extra
получает немного больше (более 20 объектов), он становится очень медленным.
С 3-4 объектами требуется менее 100 миллисекунд, но когда он становится больше, требуется гораздо больше времени. С 50 объектами он занимает 6238 миллисекунд.
Вопросы
- Почему это происходит?
- Как ускорить этот процесс?
- Есть ли другой способ, который выполняет этот процесс, но быстрее?
Рассмотрите возможность создания индекса для «дополнительных». –
@FelipeSulser К сожалению, это невозможно, потому что индексный ключ слишком велик. – stackyname
Использует ли агрегацию работу быстрее, так как я не думаю, что использование find и count - правильный путь. Например db.collectionName.aggregate ({$ group: {_id: "$ extra.eid", count: {$ sum: 1}}}); –