fogine/couchbase-odm

View on GitHub
tutorials/2.schemaDefinitionGuide.md

Summary

Maintainability
Test Coverage
Model schema is defined in [JSON SCHEMA](http://json-schema.org/latest/json-schema-validation.html) format.  
`json-schema` implementation is provided by [Ajv](https://github.com/epoberezkin/ajv) library and thus you can utilize the full power of [Ajv](https://github.com/epoberezkin/ajv)!

Primitive data type definition
-------------------------------
````javascript
    {
        type: 'object',
        properties: {
            required: ['username', 'sex'],//by default all properties are optional
            username: { // defines `username` property of type `string` with default value being `happiecat`
                type: 'string',
                default: "happiecat"
            },
            age: {type: 'integer'},
            sex: {
                type: 'string',
                enum: ['male', 'female']
            }
        }
    }
````

Compound data types
-------------------------------
````javascript
    {
        type: 'object',
        properties: {
            apps: {
                type: 'array',
                default: [], // => defines default array value
                items: { // => array item schema definition is optional. Defines schema of an item of the array
                    type: 'object',
                    default: {name: 'Snapchat'}, // => defines default array ITEM value
                    properties: {/* ... */}
                }
            },
            address: {
                type: 'object',
                additionalProperties: false, //filters out everything except described properties
                properties: {
                    street: {type: 'string'},
                    city: {type: 'string'}
                }
            },
            friend: {
                type: 'object',
                $relation: {type: 'User'} // defines relation to User Model
            }
        }
    }
````

More complex example
---------------------------

````javascript
//File image model
const Image = couchbase.define('Image', {
    type: 'string'
});

//User model
const User = couchbase.define('User', {
    type: 'object',
    required: ['username', 'born_at'],
    properties: {
        username: {type: 'string'},
        friends: {
            type: 'array',
            items: {
                type: 'object',
                $relation: {type: 'User'}
            }
        },
        address: { type: 'object' },
        profilePicture: {
            type: 'object',
            $relation: {type: "Image"}
        },
        isVerified: {
            type: 'boolean',
            default: false
        }
        born_at: {
            type: 'string',
            format: 'date-time'
        }
    }
});
````

Root schema data type does not have to be an `object`, it can also be an `array` or one of the primitive data types like `string` or `integer`.