sql >> Base de Datos >  >> NoSQL >> MongoDB

Agregar nuevo validador a la colección existente

Probablemente "debería" anteponer esto con un concepto erróneo en su pregunta. El hecho es que MongoDB se diferencia del RDBMS tradicional en que es "sin esquema" y, de hecho, no necesita "crear campos" en absoluto. Entonces, esto difiere de un "esquema de tabla" en el que no puede hacer nada hasta que cambie el esquema. Sin embargo, la "validación" es una cosa diferente, así como una característica "todavía" relativamente nueva al momento de escribir.

Si desea "agregar una regla de validación" luego hay métodos que dependen del estado actual de la colección. En cualquier caso, en realidad no hay una función "añadir a", sino que la acción es "reemplazar" todos las reglas de validación con otras nuevas para especificar. Siga leyendo para conocer las reglas de cómo funciona esto.

Documentos existentes

Cuando la colección tiene documentos existentes, como se indica en la documentación

Documentos existentes

Puede controlar cómo MongoDB maneja los documentos existentes usando validationLevel opción.

De forma predeterminada, validationLevel es estricto y MongoDB aplica reglas de validación a todas las inserciones y actualizaciones. Configuración de validationLevel a moderado aplica reglas de validación a las inserciones y actualizaciones de los documentos existentes que cumplen los criterios de validación. Con el moderado nivel, las actualizaciones de los documentos existentes que no cumplen los criterios de validación no se comprueban para verificar su validez.

Esta y la siguiente sección de ejemplo básicamente dicen que además de las opciones en .createCollection() también puede modificar una colección existente con documentos, pero debe tener "cuidado" de que los documentos actuales pueden no cumplir con las reglas requeridas. Por lo tanto, use "moderado" si no está seguro de que la regla se cumplirá para todos documentos de la colección.

Para aplicar, usa el .runCommand() método en la actualidad para emitir el "comando" que establece las reglas de validación. Que es "validationLevel" del pasaje anterior.

Como tiene reglas existentes, podemos usar `.getCollectionInfos() para recuperarlas y luego agregar la nueva regla y aplicar:

let validatior = db.getCollectionInfos({name: "MyTestCollection"})[0].options.validator;

validator.$or.push({ "LastLoginDate": { "$type": "date" } });

db.runCommand({
  "collMod": "MyTestCollection",
  "validator": validator,
  "validationLevel": "moderate"
});

Por supuesto, como se señaló anteriormente, si está seguro de que todos los documentos cumplen con las condiciones, puede aplicar "estricto" como predeterminado en su lugar.

Colección vacía

Si en el caso es que la colección está realmente "vacía" sin ningún documento o puede "eliminar" la colección ya que los datos actuales no tienen importancia, luego puede simplemente variar lo anterior y usar .createCollection() en combinación con .drop() :

let validatior = db.getCollectionInfos({name: "MyTestCollection"})[0].options.validator;

validator.$or.push({ "LastLoginDate": { "$type": "date" } });

db.getCollection("MyTestCollection").drop();

db.createCollection( "MyTestCollection", { "validator": validator });