Estou usando o mongodb 3.6 e tenho o validador abaixo para a students
coleção:
rs1:PRIMARY> db.getCollectionInfos({name: 'students'})
[
{
"name" : "students",
"type" : "collection",
"options" : {
"validator" : {
"$jsonSchema" : {
"properties" : {
"name" : {
"bsonType" : "string",
"description" : "name"
},
"age" : {
"bsonType" : "int",
"minimum" : 10,
"maximum" : 30
}
},
"required" : [
"name",
"age"
],
"bsonType" : "object"
}
},
"validationLevel" : "strict",
"validationAction" : "error"
},
"info" : {
"readOnly" : false,
"uuid" : BinData(4,"111r7z+rQpGoebZ1jAHO4g==")
},
"idIndex" : {
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.students"
}
}
]
requer duas propriedades name
e age
. O nome deve ser uma string e a idade deve estar entre 10 e 30. Mas por que a inserção abaixo falha?
rs1:PRIMARY> db.students.insert({age: 11, name: 'Mike'})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Como eu posso ver que você está recebendo a
writeError
inserçãoError code : 121
assimDe acordo com a documentação do blog do MongoDB
@Jai Hirsch
aqui para validação de documentos do MongoDB. Às vezes você quer documentos de forma totalmente livre e às vezes não. Na3.2 release of MongoDB
ideia dedocument validation
foi introduzida. Uma área que encontrei problemas no passado é com datas sendo inseridas usando diferentes tipos de dados.Exemplo: (notação de linha de comando usada para abreviar) A primeira equipe estava usando datas numéricas:
A segunda equipe estava usando o formato de string:
A terceira equipe estava usando datas ISO:
Os problemas de comunicação que levam a esse problema são uma história para outro momento, mas é desnecessário dizer que uma boa quantidade de limpeza de dados foi necessária para corrigir o problema, pois o aplicativo principal que lia os dados esperava uma data ISO. O problema do código foi resolvido usando uma biblioteca compartilhada que definia o objeto de mapeamento do banco de dados. Agora vamos dar uma olhada em como a validação de documentos pode ser usada para resolver esse problema.
Vamos criar uma coleção com o seguinte comando:
Com a coleção criada com o validador agora só se pode inserir usando o novo formato Date():
As inserções numéricas e de string darão o seguinte erro:
da mesma forma, quase todo desenvolvedor novo
MongoDB
cometerá esse "erro" na linha de comando, como:Alguém poderia pensar que eles inseriram um documento contendo o número inteiro
two
na coleção, quando na verdade o documento agora contém um valor de ponto flutuante.Posso atestar a dor que isso pode causar (especialmente se você estiver usando uma linguagem fortemente tipada, como
JAVA
).Podemos usar o validador para nos proteger contra isso:
A inserção anterior agora nos dará o
121 error code
e você precisa usar oNumberInt constructor
: