2017-02-14 19 views
0

У меня есть двоичное поле, которое я храню в монго. Значение представляет собой хеш MD5 на данный момент, но есть шанс, что это может измениться в будущем. Я пытаюсь решить, какой двоичный подтип bson использовать. В частности, я не уверен, следует ли использовать BSON.BSON_BINARY_SUBTYPE_DEFAULT или BSON.BSON_BINARY_SUBTYPE_MD5. Способно ли монго использовать этот подтип для выполнения каких-либо оптимизаций? Например, может ли он построить более интеллектуальные индексы, если он знает, что это MD5?Для двоичных полей bson mongo использует подтип по любой причине

+0

Но эти подтипы являются только частью спецификации BSON, он не должен увидеть что-то с сервером MongoDB сами по себе, в базе данных все сохраняется как BSON, подтипы являются перечисляемые типы, вы используете в своем приложении. – Euclides

+0

@Euclides Я думаю, это мой вопрос. Являются ли подтипы только для прикладной логики, или Монго использует эти подтипы для каких-либо оптимизаций? – herbrandson

+0

Да, это только для логики приложения. Есть что-то названное хешированным индексом, но согласно документации MongoDB поддерживает хешированные индексы любого отдельного поля, но даже в этом случае речь идет не о подтипах, на которые вы смотрите. – Euclides

ответ

0

MongoDB может хранить хешированный индекс, используя «скрытые» ключи привязки.

https://docs.mongodb.com/manual/core/index-hashed/

Если вы не хотите, чтобы выполнить запрос подстановочного выставлял этот конкретным индекс, индекс хэша может «сжиматься» или «расширение» Индексируемо полем вниз/до известного размера. Это означает, что вы можете индексировать очень длинную строку (длиной 4 МБ) с помощью указательного ключа длины, заданного функцией хэширования (возможно, длиной 32 байта).

Приложение не нуждается ни в чем знать о функции хеширования или внутри, вы увидите только более быстрые результаты запроса за счет потенциальных, но чрезвычайно маловероятных хеш-коллизий.

Тогда есть также побитовые операторы привязки, доступные для приложения, включая тип привязки, который вы хотите сохранить. Наиболее очевидным случаем является веб-приложение, хранящее журналы, включая IP-адрес пользователя в виде двоичных данных и подтип, определенный пользователем.

Ваш запрос может использовать $ bitsAllSet для использования стандартных сетевых масок для запроса того, какие соединения были сделаны из определенного сетевого диапазона. MongoDB вполне способен проверить, что

  1. ключ документа содержит правильный подтип (определяется пользователем и не UUID/MD5)
  2. если первый матч проходит, он будет выполнять несколько более дорогостоящую операцию побитового ,

https://docs.mongodb.com/v3.2/reference/operator/query-bitwise/