Almacenar nulo vs no almacenar la clave en absoluto en MongoDB

Me parece que cuando estás creando un documento Mongo y tienes un campo{key, value} que a veces no va a tener un valor, tiene dos opciones:

Escribir{key, null} es decir, escribir valor nulo en el campoNo guarde la clave en ese documento en absoluto

Ambas opciones son fácilmente consultables, en una consulta{key : null} y el otro lo pides{key : {$exists : false}}.

Realmente no puedo pensar en ninguna diferencia entre las dos opciones que tendrían algún impacto en el escenario de una aplicación (excepto que la opción 2 tiene un poco menos de almacenamiento).

¿Alguien puede decirme si hay alguna razón por la que uno preferiría cualquiera de los dos enfoques sobre el otro y por qué?

EDITAR

Después de formular la pregunta, también se me ocurrió que los índices pueden comportarse de manera diferente en los dos casos, es decir, se puede crear un índice disperso para la opción 2, pero todavía estoy tratando de comparar y entender cuáles serán las consideraciones del índice completo en los dos enfoques. .

 Christopher13 sept. 2012 16:54
Para lo que vale, "un poco menos de almacenamiento" puede ser más significativo a gran escala, especialmente cuando se habla del tamaño de los conjuntos de trabajo en la memoria.

Respuestas a la pregunta(4)

Otro punto que quizás desee considerar es cuando usa herramientas OGM como Hibernate OGM.

Si está utilizando Java, Hibernate OGM es compatible con el estándar JPA. Entonces, si puede escribir una consulta JPQL, sería teóricamente fácil si desea cambiar a un almacén de datos NoSQL alternativo que sea compatible con la herramienta OGM.

JPA no define un equivalente para $ existe en Mongo. Entonces, si tiene atributos opcionales en su colección, entonces no puede escribir un JPQL adecuado para el mismo. En tal caso, si el valor del atributo se almacena como NULO, aún es posible escribir una consulta JPQL válida como la que se muestra a continuación.

SELECT p FROM pppoe p where p.logout IS null;
 Zaid Masud25 abr. 2019 14:58
Entiendo, solo estoy diciendo que creo queSELECT p FROM pppoe p where p.logout IS null; incluiráatributos perdidos en el resultado.
 Zaid Masud18 abr. 2019 16:43
La consulta de nulos en MongoDB incluye valores perdidos.Del doc oficial: "Los{ item : null } la consulta coincide con los documentos que contienen el campo del elemento cuyo valor es nuloo que no contengan el campo item. "
 Vinod24 abr. 2019 13:08
MongoDB de hecho admite la consulta de nulos, pero el punto era sobre la equivalencia funcional con JPQL. Si faltara un atributo, no sería posible escribir un JPQL equivalente.
Solución de preguntas

De hecho tienes también una tercera posibilidad:key: "" (valor vacío)

Y te olvidas de una especificidad sobre el valor nulo. Consulta enkey: null Te recuperaré todo el documento donde la clave es nula.o donde la llave no existe

Cuando una consulta en$exists:false recuperará solo el documento donde no existe la clave de campo.

Para volver a su pregunta exacta, depende de sus consultas y qué datos representan. Si necesita mantener eso, por ejemplo, un usuario establece un valor y luego lo desactiva, debe mantener el campo como nulo o vacío. Si no lo necesita, puede eliminar este campo.

 Sani Yusuf20 ene. 2017 18:30
Me mantendré alejado de la clave: "" personalmente, ya que esto implica que es una cadena. Si recuperas un campo de este tipo y haces algo como isKeyExists (clave), esto pasará como verdadero aunque sea una cadena vacía. Así que digamos que esperabas un error booleano en esa sala.

Tenga en cuenta que, dado que MongoDB no utiliza la compresión del diccionario de nombres de campo,field:null consume espacio en disco y RAM, mientras que el almacenamiento de una clave no consume recursos.

 ankitjaininfo15 may. 2018 20:58
¿Esta respuesta sigue siendo válida en 2018?
 Samuel García05 feb. 2019 12:34
¡Lo siento por la respuesta tardía! No creo que siga siendo el caso. Con el almacenamiento y la compresión ágil de WiredTiger habilitados, creo que no debería notarse.

Realmente se reduce a:

Tu escenarioSu forma de consultaTu índice necesitaTu lenguaje

Yo personalmente he optado por almacenar claves nulas. Hace que sea mucho más fácil de integrar en mi aplicación. Utilizo PHP con Active Record y el uso de valores nulos hace que mi vida sea mucho más fácil ya que no tengo que poner el estrés de la dependencia de campo en la aplicación. Además, no necesito hacer ningún código complejo para lidiar con las magias para establecer variables no existentes.

Yo personalmente no almacenaría un valor vacío como"" ya que si no tienes cuidado podrías tener dos valores vacíos.null y"" y luego tendrá un tiempo de consulta específica. Así que personalmente prefieronull para valores vacíos.

En cuanto al espacio y el índice: depende de cuántas filas no tengan esta columna, pero dudo que realmente note el aumento en el tamaño del índice debido a unos cuantos documentos adicionales con nulo. Quiero decir que la diferencia en el almacenamiento es mínima, especialmente si la correspondiente El nombre clave es pequeño también. Eso va para configuraciones grandes también.

Estoy francamente inseguro del uso del índice entre$exists ynull sin embargonull podría ser un método más estandarizado para consultar la existencia, ya que recuerde que MongoDB no tiene esquemas, lo que significa que no tiene ningún requisito para tener ese campo en el documento que, de nuevo, produce dos valores vacíos: inexistente ynull. Así que mejor elegir uno u otro.

yo elijonull.

 Sammaye14 sept. 2012 13:17
@ZaidMasud Sí en C #, así como en los problemas de los controladores, tiene el lenguaje muy tipificado. Esta es la razón por la que es una pregunta tan difícil de responder, ya que no existe un estándar en todas las plataformas, a diferencia de CSS o HTML o OOP, etc. Todo depende de usted.
 Zaid Masud14 sept. 2012 12:57
Gracias ... pero no estoy convencido de que usar null facilite el código de la aplicación (al menos no en el controlador C # que estoy usando). No hay ningún código complejo, ya que las claves no existentes se deserializan automáticamente a nulas en el controlador C #.

Su respuesta a la pregunta