Search code examples
mongodbjsonschemaref

MongoDB Linking a $jsonSchema to another $jsonSchema


I have two schemas with 1 to N relation. one is book and the other author.

enter image description here

I have crated three files names: book.js, genre.js and author.js below. As you see, I have referenced in the book the genre and author from other files.

author: {
               $ref: "./models/author.js"
            },

and

"genre" : {
               $ref: "./models/genre.js",
               description: "must be a string and is required"
        }

However, When I issue that in mongo> i get the following:

{
"ok" : 0,
"errmsg" : "$jsonSchema keyword '$ref' is not currently supported",
"code" : 9,
"codeName" : "FailedToParse"

}

I was wondering How I could do that please?

// book.js
var book = {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: [ "title", "author", "summary", "isbn", "genre" ],
         properties: {
            title: {
               bsonType: "string",
               description: "must be a string and is required"
            },
            author: {
               $ref: "./models/author.js"
            },
            isbn: {
               bsonType: "int",
               minimum: 2017,
               maximum: 3017,
               exclusiveMaximum: false,
               description: "must be an integer in [ 2017, 3017 ] and is required"
            },
            "summary" : {
               bsonType: "string",
               description: "must be a string and is required"
            },
            "genre" : {
               $ref: "./models/genre.js"
            }
         }
      }
   }
};

module.exports = book;

//genre.js
var genre = {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: [ "name"],
         properties: {
            first_name: {
               bsonType: "string",
               size: 100,
               description: "must be a string and is required"
            },
            url: {
               bsonType: "string",
               minLength:3,
               maxLength:20,
               description: "must be a string and size between [3, 100] is not required"
            }
        }
      }
   }
};
module.exports = genre;

//author.js
var Author = {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: [ "first_name", "family_name" ],
         properties: {
            first_name: {
               bsonType: "string",
               maxLength:100,
               description: "must be a string and is required"
            },
            family_name: {
               bsonType: "string",
               maxLength:100,
               description: "must be a string and is not required"
            },
            date_of_birth: {
               bsonType: "int",
               minimum: 0,
               maximum: 2018,
               exclusiveMaximum: false,
               description: "must be an integer in [ 0, 3017 ] and is required"
            },
            date_of_death: {
               bsonType: "int",
               minimum: 0,
               maximum: 2018,
               exclusiveMaximum: false,
               description: "must be an integer in [ 0, 2018 ] and is required"
            }
         }
      }
   }
};
module.exports = Author;

It seems the Manual References does not work:

$jsonSchema: {
         bsonType: "object",
         required: [ "title", "author_id", "summary", "isbn", "genre" ],
         properties: {
            title: {
               bsonType: "string",
               description: "must be a string and is required"
            },
            author_id: {
               bsonType: ObjectId(),
               description: "must be a string and is required"
            },
            isbn: {

as

{
    "ok" : 0,
    "errmsg" : "$jsonSchema keyword 'bsonType' must be either a string or an array of strings",
    "code" : 14,
    "codeName" : "TypeMismatch"
}

Solution

  • "$jsonSchema keyword '$ref' is not currently supported",

    As per the error message you encountered, the implementation of JSON Schema does not (as at MongoDB 4.0) support references ($ref). Since $jsonSchema is being validated on the database server a relative file path isn't appropriate; you should instead inline the required schema validation rules.

    If you want more flexibility you could look for a validation library you can use in your application code. There are several JSON Schema packages on NPM as well as alternative approaches such as Object-Document Mappers (for example, Mongoose).

    It seems the Manual References does not work

         bsonType: ObjectId(),
    

    The ObjectId() usage here isn't valid JSON. You need to specify a string value with the BSON type: bsonType: "objectId".

    For more information see $jsonSchema Extensions and Omissions in the MongoDB documentation for your server version.