Подтвердить что ты не робот

Хранение значения null, а не сохранение ключа вообще в MongoDB

Мне кажется, что когда вы создаете Mongo-документ и имеете поле {key, value}, которое иногда не имеет значения, у вас есть два варианта:

  • Напишите {key, null}, то есть напишите нулевое значение в поле
  • Не храните ключ в этом документе вообще

Оба параметра легко доступны для запроса, в одном запросе для {key : null}, а другой - для {key : {$exists : false}}.

Я не могу думать о каких-либо различиях между двумя параметрами, которые могут иметь какое-либо влияние в сценарии приложения (за исключением того, что опция 2 имеет немного меньше памяти).

Может ли кто-нибудь сказать мне, есть ли какие-либо причины, по которым вы предпочитаете один из двух подходов друг к другу, и почему?

ИЗМЕНИТЬ

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

4b9b3361

Ответ 1

Действительно, у вас есть и третья возможность: key: "" (пустое значение)

И вы забудете специфику нулевого значения. Запрос на key: null доставит вам весь документ, где ключ имеет значение null или, где ключ не существует.

Когда запрос на $exists:false будет извлекать только документ, где ключ поля не существует.

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

Ответ 2

Обратите внимание, что поскольку MongoDB не использует сжатие слова имени поля, field:null потребляет дисковое пространство и оперативную память, в то время как сохранение ключа вообще не потребляет ресурсы.

Ответ 3

Это действительно сводится к:

  • Ваш сценарий
  • Ваш запрос
  • Ваш индекс нуждается
  • Ваш язык

Я лично выбрал сохранение нулевых ключей. Это упрощает интеграцию в мое приложение. Я использую PHP с Active Record, а нулевые значения uisng значительно облегчают мою жизнь, так как мне не нужно ставить стресс в зависимости от приложения. Также мне не нужно создавать сложный код для работы с магией, чтобы установить несуществующие переменные.

Я лично не сохранил бы пустое значение, например "", так как если бы вы не были осторожны, у вас могли бы быть два пустых значения null и "", и тогда у вас будет определенное время запроса запросов. Поэтому я лично предпочитаю null для пустых значений.

Что касается пространства и индекса: это зависит от того, сколько строк может не иметь этот colum, но я сомневаюсь, что вы действительно заметите увеличение размера индекса из-за нескольких дополнительных документов с нулевым значением. Я имею в виду, что разница в хранении - если соответствующее имя ключа также мало. Это также относится к большим настройкам.

Я откровенно не уверен в использовании индекса между $exists и null, однако null может быть более стандартизованным методом, чтобы запросить существование, поскольку помните, что MongoDB является схематичным, что означает, что у вас нет требования это поле в документе, которое снова создает два пустых значения: несуществующий и null. Так лучше выбрать тот или другой.

Я выбираю null.

Ответ 4

Еще один момент, который вы, возможно, захотите рассмотреть, - это использовать инструменты OGM, такие как Hibernate OGM.

Если вы используете Java, Hibernate OGM поддерживает стандарт JPA. Поэтому, если вы можете написать запрос JPQL, вам было бы теоретически легко, если вы захотите переключиться на альтернативный хранилище данных NoSQL, которое поддерживается инструментом OGM.

JPA не определяет эквивалент для $существует в Монго. Поэтому, если у вас есть дополнительные атрибуты в вашей коллекции, вы не можете написать правильный JPQL для этого. В таком случае, если значение атрибута хранится как NULL, тогда еще можно написать допустимый запрос JPQL, как показано ниже.

SELECT p FROM pppoe p where p.logout IS null;