Looking for Cloud Services or Professional Support? Check restheart.com

Document validation with JSON schema

Introduction

MongoDB is schemaless, JSON documents of any format can be stored in collections. Starting from MongoDB version 3.2 rules-based validation is available to enforce a format to documents (more in the  MongoDB documentation) and this is supported by RESTHeart.

On top of this, RESTHeart provides a more general approach for validation based on Request Checkers: a Request Checker can verify write requests based on any condition.

RESTHeart provides “out of the box” the jsonSchema Request Checker that validates the body of write requests against a JSON schema.

JSON Schema specifies a JSON-based format to define the structure of JSON data for validation, documentation, and interaction control. A JSON Schema provides a contract for the JSON data required by a given application, and how that data can be modified.

For more information about JSON Schema refer to json-schema.org; a very good resource is understanding json schema web site too.

The Schema Store and Schema resources

Schema Store resources allow store JSON schemas used for document validation; they are specialized collection resources whose documents must conform to the JSON schema format (specifically to the latest version draft-04)

Schema Store are first class citizens in RESTHeart and the format of their URIs is /<db>/_schemas

Create the db schema store

PUT /db/_schemas

Schema resources are documents of the Schema Store. The following request creates a valid JSON Schema.

PUT /db/_schemas/address {
    "$schema": "https://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "address": { "type": "string" },
        "city": { "type": "string" },
        "postal-code": { "type": "string" },
        "country": { "type": "string"}
    },
    "required": ["address", "city", "country"]
}
 
HTTP/1.1 201 Created
...

In JSON Schema, the id property (not to be confused with the _id key) has a special role. This property is auto-generated by RESTHeart as can be noted in the response of the following GET request.

GET /db/_schemas/address
HTTP/1.1 200 OK
...
{
    "$schema": "https://json-schema.org/draft-04/schema#""id": "https://schema-store/test/address#", 
    "_id": "address",  
    ....
}

Document validation

To apply the jsonSchema checker simply define the collection checkers metadata property as follows:

{ "checkers": [ { "name": "jsonSchema", "args": { "schemaId": <schema_id>, "schemaStoreDb": <schema_store_db> } } ] }
Property
Description
Mandatory
schemaId

the _id of the JSON schema to enforce

Yes
schemaStoreDb the db No, if omitted the current db is used.

Example

Create a collection enforcing the address JSON Schema

PUT /db/addresses { "checkers": [  { "name": "jsonSchema", "args": { "schemaId": "address" } } ] }

Now let’s try to create an invalid document.

Try to create an invalid address

POST /db/addresses { "address": "Via D'Annunzio 28" }
 
HTTP/1.1 400 Bad Request
...

{
    "_links": {
        "self": {
            "href": "/test/addresses"
        }
    }, 
    "http status code": 400, 
    "http status description": "Bad Request", 
    "message": "schema check failed, #: 2 schema violations found, #: required key [city] not found, #: required key [country] not found"
}

Passing valid data results in the document creation:

Create a valid documents

POST /test/addresses {"address": "Via D'Annunzio, 28", "city": "L'Aquila", "country": "Italy" }

HTTP/1.1 201 Created...