Я чувствую, что на мой вопрос будет очень простой ответ, но вот оно.
У меня есть структура MongoDB, например
{
...
a: [array elements],
b: [array elements],
c: [array elements],
...
}
Я использую Mongoose, и в настоящее время у меня выходят 3 разных вызова.
Model.find().distinct('a', ...)
Model.find().distinct('b', ...)
Model.find().distinct('c', ...)
Это дает мне то, что я хочу, но я хотел бы получить информацию за один звонок. Я подумал, что смогу использовать агрегат для этого и получить новый объект, который выглядит как
{
a: [distinct array elements],
b: [distinct array elements],
c: [distinct array elements]
}
Каким будет самый быстрый способ получить это от MongoDB за один раз?





Можно получить все 3 в одном запросе, используя конвейер агрегации, например:
[
{$facet:{
a: [{$group:{_id:null, values:{$addToSet:"$a"}}}],
b: [{$group:{_id:null, values:{$addToSet:"$b"}}}],
c: [{$group:{_id:null, values:{$addToSet:"$c"}}}],
}}
]
Однако это потребует чтения каждого документа с диска, повторения всего этого списка 3 раза и создания наборов в памяти на том же этапе агрегирования. В большом наборе данных это может превышать предел памяти для одного этапа.
Если коллекция имеет индекс на {a:1}, запрос Model.find().distinct('a') может использовать этап «DISTINCT_SCAN», то есть он будет обращаться к индексу только для получения значений, а не читать какие-либо документы напрямую.
Если все 3 поля проиндексированы, 3 отдельных запроса distinct будут самым быстрым способом.
Еще один вопрос. Если я установлю индекс для типа массива в Mongoose, будет ли он индексировать значения в массиве или весь массив? Я хочу, чтобы индексировались только значения.
Отдельные вопросы нужно задавать отдельно. Пожалуйста, задайте новый вопрос, если он не дает адекватного ответа: stackoverflow.com/questions/7396219/…
Имеет смысл ограничить количество читаемых документов. Я новичок в базах данных, поэтому спасибо, что познакомили меня с индексами. Я также пытаюсь ограничить свои API и вызовы базы данных (также известный как сетевой трафик), поэтому есть ли способ заставить конвейер агрегации также использовать индексы, или я просто не понимаю, как работает конвейер агрегации.