Создание отдельного индекса для category.type
(возможно, в дополнение к category
) кажется наилучшим вариантом.
Вы можете использовать запрос диапазона с $gt
и $lt
. Они будут работать с двоичным представлением внедренного объекта, который работает только для первого (в порядке хранения) поля, и только если это первое поле одинаково во всех документах, поэтому оно не очень гибкое и его легко разбить.
{"category" : {"$gt": {"type": "memory"}, "$lt": {"type": "memoryX" } } }
«memoryX» здесь служит точкой отсечения: все с «памятью» будет сортировать до этого.
Обратите внимание, что для этого необходимо, чтобы поле "type" было первым в двоичном представлении для всех документов, в которых оно есть. Он также работает ТОЛЬКО для поля «тип» (нет возможности запрашивать другие поля в первой позиции, вы должны выбрать одно заранее), таким образом, вы практически не получаете преимущества над выделенным индексом «category.type» (просто пробел) экономии).
Я экспериментировал с этой идеей раньше, см. эту ветку в списке рассылки . Это работает, но вы должны быть осторожны в своих действиях:
Это поддерживается и стабильно. Многие из шардинга / репликации
внутренние компоненты используют значения _id, которые являются встроенными документами.
Единственное, на что следует обратить внимание, это упорядочить ключи в
встроенный элемент Они отсортированы по их двоичному представлению так
{x: 1, y: 1} отличается от {y: 1, x: 1} и сортируется по-разному. Не
только они отсортированы по-разному, это разные значения. Немного
языки всегда сортируют ключи в словаре / хэше / карте по умолчанию.
Опять же, рассмотрите возможность создания дополнительных индексов для полей, которые вам нужны.
В моем случае мне нужно будет только запросить «a», «a, b» или «a, b, c» или «a, x, y», где документы, содержащие x, никогда не содержат «b». 'или' c '
Это, вероятно, сработало бы тогда. Я бы все же сделал два составных индекса a,b
и a,x
. Или, может быть, просто b
и x
. Учитывая, что документ содержит b
или x
, вы, вероятно, уже эффективно отфильтровали ненужные документы в отношении a
(form_factor = 2.5in уже говорит о том, что это жесткий диск, класс = DDR400 уже делает его памятью ).
И после фильтрации по a,b
вам может не понадобиться индекс для дальнейшего углубления до c
.
Используя этот хитрый запрос к двоичному представлению, вы становитесь зависимыми от того, что можно назвать деталями реализации. Вас могут сбить водители, которым нравится переупорядочивать поля, или что-то вроде этой проблемы о том, что сам Mongo иногда перетасовывает вещи.