Si vous utilisez mongo version 3.6, vous pouvez activer la validation de schéma en utilisant $jsonSchema
côté serveur
chaque document que nous mettons à jour/insérons sera validé par rapport au schéma de validation, si la validation échoue, une erreur sera générée et aucune modification ne sera apportée au document
exemple de node
schéma de collecte
{
_id : string,
parent : [string, null],
children : string[2]
}
schéma de validation
db.createCollection("node", {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "_id" ],
properties: {
parent: {
bsonType: ["string", "null"],
description: "must be a string"
},
children: {
bsonType: ["array"],
items : { bsonType: ["string"] },
minItems: 0,
maxItems: 2,
description: "must be a array of string and max is 2"
}
}
}
}
});
insère [avec des documents valides]
> db.node.insert( { _id: "Books", children: [ "Programming" ], parent: null } )
WriteResult({ "nInserted" : 1 })
> db.node.insert( { _id: "Programming", children: [ "Databases", "Languages" ], parent: "Books" } )
WriteResult({ "nInserted" : 1 })
> db.node.insert( { _id: "Languages", children: [ ], parent: "Programming" } )
WriteResult({ "nInserted" : 1 })
> db.node.insert( { _id: "Databases", children: [ "MongoDB", "dbm" ], parent: "Programming" } )
WriteResult({ "nInserted" : 1 })
> db.node.insert( { _id: "MongoDB", children: [ ], parent: "Databases" } )
WriteResult({ "nInserted" : 1 })
> db.node.insert( { _id: "dbm", children: [ ], parent: "Databases" } )
WriteResult({ "nInserted" : 1 })
>
trouver
> db.node.find()
{ "_id" : "Books", "children" : [ "Programming" ], "parent" : null }
{ "_id" : "Programming", "children" : [ "Databases", "Languages" ], "parent" : "Books" }
{ "_id" : "Languages", "children" : [ ], "parent" : "Programming" }
{ "_id" : "Databases", "children" : [ "MongoDB", "dbm" ], "parent" : "Programming" }
{ "_id" : "MongoDB", "children" : [ ], "parent" : "Databases" }
{ "_id" : "dbm", "children" : [ ], "parent" : "Databases" }
insérer avec un document invalide [taille enfant> 2]
> db.node.insert({_id : "1", children : ["c1", "c2", "c3"], parent : "p1"})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
>
l'insertion a échoué avec une erreur de validation
mise à jour - tentative d'ajout d'un troisième enfant pour les bases de données _id, échec avec erreur de validation
> db.node.updateOne( { _id: "Databases"}, {$push : {children: [ "Oracle" ]}} )
2018-02-25T21:00:08.087+0530 E QUERY [thread1] WriteError: Document failed validation :
WriteError({
"index" : 0,
"code" : 121,
"errmsg" : "Document failed validation",
"op" : {
"q" : {
"_id" : "Databases"
},
"u" : {
"$push" : {
"children" : [
"Oracle"
]
}
},
"multi" : false,
"upsert" : false
}
})
[email protected]/mongo/shell/bulk_api.js:466:48
Bulk/[email protected]/mongo/shell/bulk_api.js:846:49
Bulk/[email protected]/mongo/shell/bulk_api.js:910:13
Bulk/[email protected]/mongo/shell/bulk_api.js:1154:21
[email protected]/mongo/shell/crud_api.js:572:17
@(shell):1:1
>
veuillez vous référer à schema-validation &jsonSchema pour plus d'options, ajouter la validation à la collection existante et gérer les échecs de validation