

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Utilisation de la validation du schéma JSON
<a name="json-schema-validation"></a>

À l'aide de l'opérateur de requête d'`$jsonSchema`évaluation, vous pouvez valider les documents insérés dans vos collections.

**Topics**
+ [Création et utilisation de la validation du schéma JSON](#get-started-with-validation)
+ [Mots clés pris en charge](#json-supported-keywords)
+ [bypassDocumentValidation](#json-schema-bypass)
+ [Limites](#json-schema-limitations)

## Création et utilisation de la validation du schéma JSON
<a name="get-started-with-validation"></a>

### Création d'une collection avec validation de schéma
<a name="create-collection-with-validation"></a>

Vous pouvez créer une collection avec des règles de `createCollection` fonctionnement et de validation. Ces règles de validation sont appliquées lors des insertions ou des mises à jour de documents Amazon DocumentDB. L'exemple de code suivant montre les règles de validation pour un ensemble d'employés :

```
db.createCollection("employees", {
   "validator": {
      "$jsonSchema": {
         "bsonType": "object",
         "title": "employee validation",
         "required": [ "name", "employeeId"],
         "properties": {
            "name": {
                  "bsonType": "object",
                  "properties": {
                     "firstName": {
                        "bsonType": ["string"]
                     },
                     "lastName": {
                        "bsonType": ["string"]
                     }
                  },
                  "additionalProperties" : false 
            },
            "employeeId": {
               "bsonType": "string",
               "description": "Unique Identifier for employee"
            },
             "salary": {
               "bsonType": "double"
            },
            "age": {
               "bsonType": "number"
            }
         },
         "additionalProperties" : true 
      }
   },
   "validationLevel": "strict", "validationAction": "error"
} )
```

### Insérer un document valide
<a name="insert-valid-document"></a>

L'exemple suivant insère des documents conformes aux règles de validation du schéma ci-dessus :

```
db.employees.insert({"name" : { "firstName" : "Carol" , "lastName" : "Smith"}, "employeeId": "c720a" , "salary": 1000.0 })
db.employees.insert({ "name" : { "firstName" : "William", "lastName" : "Taylor" }, "employeeId" : "c721a", "age" : 24})
```

### Insérer un document non valide
<a name="insert-invalid-document"></a>

L'exemple suivant insère des documents qui ne sont pas conformes aux règles de validation du schéma ci-dessus. Dans cet exemple, la valeur EmployeeID n'est pas une chaîne :

```
db.employees.insert({
    "name" : { "firstName" : "Carol" , "lastName" : "Smith"}, 
    "employeeId": 720 , 
    "salary": 1000.0 
})
```

Cet exemple montre une syntaxe incorrecte dans le document.

### Modifier une collection
<a name="modify-collection"></a>

La `collMod` commande est utilisée pour ajouter ou modifier les règles de validation d'une collection existante. L'exemple suivant ajoute un champ de salaire à la liste des champs obligatoires :

```
db.runCommand({"collMod" : "employees", 
   "validator": {
      "$jsonSchema": {
         "bsonType": "object",
         "title": "employee validation",
         "required": [ "name", "employeeId", "salary"],
         "properties": {
            "name": {
                  "bsonType": "object",
                  "properties": {
                     "firstName": {
                        "bsonType": ["string"]
                     },
                     "lastName": {
                        "bsonType": ["string"]
                     }
                  },
                  "additionalProperties" : false 
            },
            "employeeId": {
               "bsonType": "string",
               "description": "Unique Identifier for employee"
            },
             "salary": {
               "bsonType": "double"
            },
            "age": {
               "bsonType": "number"
            }
         },
         "additionalProperties" : true 
      }
   }
} )
```

### Adressage des documents ajoutés avant la modification des règles de validation
<a name="pre-validation-docs"></a>

Pour traiter les documents qui ont été ajoutés à votre collection avant que les règles de validation ne soient modifiées, utilisez les `validationLevel` modificateurs suivants :
+ **strict** : applique les règles de validation à toutes les insertions et mises à jour.
+ **modéré** : applique les règles de validation aux documents valides existants. Lors des mises à jour, les documents non valides existants ne sont pas vérifiés.

Dans l'exemple suivant, après avoir mis à jour les règles de validation sur la collection nommée « employés », le champ salaire est obligatoire. La mise à jour du document suivant échouera :

```
db.runCommand({ 
    update: "employees", 
    updates: [{ 
        q: { "employeeId": "c721a" }, 
        u: { age: 25 , salary : 1000}, 
        upsert: true }] 
})
```

Amazon DocumentDB renvoie le résultat suivant :

```
{
"n" : 0,
    "nModified" : 0,
    "writeErrors" : [
        {
"index" : 0,
            "code" : 121,
            "errmsg" : "Document failed validation"
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1234567890, 1)
}
```

La mise à jour du niveau de validation `moderate` permettra au document ci-dessus d'être correctement mis à jour :

```
db.runCommand({
    "collMod" : "employees", 
    validationLevel : "moderate"
})

db.runCommand({ 
    update: "employees", 
    updates: [{ 
        q: { "employeeId": "c721a" }, 
        u: { age: 25 , salary : 1000}, 
        upsert: true }]
})
```

Amazon DocumentDB renvoie le résultat suivant :

```
{
"n" : 1,
    "nModified" : 1,
    "ok" : 1,
    "operationTime" : Timestamp(1234567890, 1)
}
```

### Récupération de documents avec le \$1JSONSchema
<a name="json-retrieve-docs"></a>

L'`$jsonSchema`opérateur peut être utilisé comme filtre pour interroger les documents qui correspondent au schéma JSON. Il s'agit d'un opérateur de niveau supérieur qui peut être présent dans les documents filtrés sous forme de champ de niveau supérieur ou utilisé avec des opérateurs de requête tels que `$and``$or`, et`$nor`. Les exemples suivants montrent l'utilisation de \$1JSONSchema en tant que filtre individuel et avec d'autres opérateurs de filtre :

Document inséré dans une collection « d'employés » :

```
{ "name" : { "firstName" : "Carol", "lastName" : "Smith" }, "employeeId" : "c720a", "salary" : 1000 }
{ "name" : { "firstName" : "Emily", "lastName" : "Brown" }, "employeeId" : "c720b", "age" : 25, "salary" : 1050.2 }
{ "name" : { "firstName" : "William", "lastName" : "Taylor" }, "employeeId" : "c721a", "age" : 24, "salary" : 1400.5 }
{ "name" : { "firstName" : "Jane", "lastName" : "Doe" }, "employeeId" : "c721a", "salary" : 1300 }
```

Collection filtrée avec l'`$jsonSchema`opérateur uniquement :

```
db.employees.find({ 
       $jsonSchema: { required: ["age"] } })
```

Amazon DocumentDB renvoie le résultat suivant :

```
{ "_id" : ObjectId("64e5f91c6218c620cf0e8f8b"), "name" : { "firstName" : "Emily", "lastName" : "Brown" }, "employeeId" : "c720b", "age" : 25, "salary" : 1050.2 }
{ "_id" : ObjectId("64e5f94e6218c620cf0e8f8c"), "name" : { "firstName" : "William", "lastName" : "Taylor" }, "employeeId" : "c721a", "age" : 24, "salary" : 1400.5 }
```

Collection filtrée avec l'`$jsonSchema`opérateur et un autre opérateur :

```
db.employees.find({ 
       $or: [{ $jsonSchema: { required: ["age", "name"]}}, 
            { salary: { $lte:1000}}]});
```

Amazon DocumentDB renvoie le résultat suivant :

```
{ "_id" : ObjectId("64e5f8886218c620cf0e8f8a"), "name" : { "firstName" : "Carol", "lastName" : "Smith" }, "employeeId" : "c720a", "salary" : 1000 }
{ "_id" : ObjectId("64e5f91c6218c620cf0e8f8b"), "name" : { "firstName" : "Emily", "lastName" : "Brown" }, "employeeId" : "c720b", "age" : 25, "salary" : 1050.2 }
{ "_id" : ObjectId("64e5f94e6218c620cf0e8f8c"), "name" : { "firstName" : "William", "lastName" : "Taylor" }, "employeeId" : "c721a", "age" : 24, "salary" : 1400.5 }
```

Collection filtrée avec l'`$jsonSchema`opérateur et avec `$match` dans le filtre agrégé :

```
db.employees.aggregate(
    [{ $match: { 
        $jsonSchema: { 
            required: ["name", "employeeId"],  
            properties: {"salary" :{"bsonType": "double"}}
        }
       }
    }]
)
```

Amazon DocumentDB renvoie le résultat suivant :

```
{ 
"_id" : ObjectId("64e5f8886218c620cf0e8f8a"),
 "name" : { "firstName" : "Carol", "lastName" : "Smith" },
"employeeId" : "c720a",
"salary" : 1000 
}
{
"_id" : ObjectId("64e5f91c6218c620cf0e8f8b"),
"name" : { "firstName" : "Emily", "lastName" : "Brown" },
"employeeId" : "c720b",
"age" : 25,
"salary" : 1050.2
}
{
"_id" : ObjectId("64e5f94e6218c620cf0e8f8c"),
"name" : { "firstName" : "William", "lastName" : "Taylor" },
"employeeId" : "c721a",
"age" : 24,
"salary" : 1400.5
}
{
"_id" : ObjectId("64e5f9786218c620cf0e8f8d"),
"name" : { "firstName" : "Jane", "lastName" : "Doe" },
"employeeId" : "c721a",
"salary" : 1300
}
```

### Afficher les règles de validation existantes
<a name="view-validation-rules"></a>

Pour consulter les règles de validation existantes sur une collection, utilisez :

```
db.runCommand({
    listCollections: 1, 
    filter: { name: 'employees' }
})
```

Amazon DocumentDB renvoie le résultat suivant :

```
{
    "waitedMS" : NumberLong(0),
    "cursor" : {
        "firstBatch" : [
            {
                "name" : "employees",
                "type" : "collection",
                "options" : {
                    "autoIndexId" : true,
                    "capped" : false,
                    "validator" : {
                        "$jsonSchema" : {
                            "bsonType" : "object",
                            "title" : "employee validation",
                            "required" : [
                                "name",
                                "employeeId",
                                "salary"
                            ],
                            "properties" : {
                                "name" : {
                                    "bsonType" : "object",
                                    "properties" : {
                                        "firstName" : {
                                            "bsonType" : [
                                                "string"
                                            ]
                                        },
                                        "lastName" : {
                                            "bsonType" : [
                                                "string"
                                            ]
                                        }
                                    },
                                    "additionalProperties" : false
                                },
                                "employeeId" : {
                                    "bsonType" : "string",
                                    "description" : "Unique Identifier for employee"
                                },
                                "salary" : {
                                    "bsonType" : "double"
                                },
                                "age" : {
                                    "bsonType" : "number"
                                }
                            },
                            "additionalProperties" : true
                        }
                    },
                    "validationLevel" : "moderate",
                    "validationAction" : "error"
                },
                "info" : {
                    "readOnly" : false
                },
                "idIndex" : {
                    "v" : 2,
                    "key" : {
                        "_id" : 1
                    },
                    "name" : "_id_",
                    "ns" : "test.employees"
                }
            }
        ],
        "id" : NumberLong(0),
        "ns" : "test.$cmd.listCollections"
    },
    "ok" : 1,
    "operationTime" : Timestamp(1692788937, 1)
}
```

Amazon DocumentDB conserve également les règles de validation lors de la phase d'`$out`agrégation.

## Mots clés pris en charge
<a name="json-supported-keywords"></a>

Les champs suivants sont pris en charge dans les `collMod` commandes `create` et :
+ **`Validator`**— Supporte `$jsonSchem` l'opérateur a.
+ **`ValidationLevel`**— Supports `off` et `moderate` valeurs. `strict`
+ **`ValidationAction`**— Supporte la `error` valeur.

L'opérateur \$1JSONSchema prend en charge les mots clés suivants :
+ `additionalItems`
+ `additionalProperties`
+ `allOf`
+ `anyOf`
+ `bsonType`
+ `dependencies`
+ `description`
+ `enum`
+ `exclusiveMaximum`
+ `exclusiveMinimum`
+ `items`
+ `maximum`
+ `minimum`
+ `maxItems`
+ `minItems`
+ `maxLength`
+ `minLength`
+ `maxProperties`
+ `minProperties`
+ `multipleOf`
+ `not`
+ `oneOf`
+ `pattern`
+ `patternProperties`
+ `properties`
+ `required`
+ `title`
+ `type`
+ `uniqueItems`

## bypassDocumentValidation
<a name="json-schema-bypass"></a>

Amazon DocumentDB prend en charge `bypassDocumentValidation` les commandes et méthodes suivantes :
+ `insert`
+ `update`
+ `findAndModify`
+ `$out`étape dans le `aggregate` commandement et dans la `db.collection.aggregate()` méthode

Amazon DocumentDB ne prend pas en charge les commandes suivantes pour : `bypassDocumentValidation` 
+ `$merge`dans la `aggregate` commande et dans la `db.collection.aggregate()` méthode
+ `mapReduce`commande et `db.collection.mapReduce()` méthode
+ `applyOps` commande

## Limites
<a name="json-schema-limitations"></a>

Les limites suivantes s'appliquent à la `$jsonSchema` validation :
+ Amazon DocumentDB renvoie l'erreur « Échec de la validation du document » lorsqu'une opération ne respecte pas la règle de validation.
+ Les clusters élastiques Amazon DocumentDB ne sont pas pris en charge. `$jsonSchema`