DATAMONGO-1835 - Add support for JSON Schema.

We now can create a $jsonSchema that can be used as a validator when creating collections and as predicate for queries. Required fields and properties get mapped according to the @Field annotation on domain objects.

MongoJsonSchema schema = MongoJsonSchema.builder().required("firstname", "lastname")
  .properties(string("firstname").possibleValues("luke", "han"),
              object("address").properties(string("postCode").minLength(4).maxLength(5)))
  .build();

resulting in the following schema:

{
  "type": "object",
  "required": [ "firstname", "lastname" ],
  "properties": {
    "firstname": {
      "type": "string", "enum": [ "luke", "han" ],
    },
    "address": {
      "type": "object",
      "properties": {
        "postCode": { "type": "string", "minLength": 4, "maxLength": 5 }
      }
    }
  }
}

Query usage:

MongoJsonSchema schema = MongoJsonSchema.builder()
  .required("address")
  .property(object("address").properties(string("street").matching("^Apple.*"))).build();

List<Person> person = template.find(query(matchingDocumentStructure(schema)), Person.class));

Collection validation:

MongoJsonSchema schema = MongoJsonSchema.builder().required("firstname", "lastname")
  .properties(string("firstname").possibleValues("luke", "han"),
              object("address").properties(string("postCode").minLength(4).maxLength(5)))
  .build();

template.createCollection(Person.class, CollectionOptions.empty()
  .schema(schema)
  .failOnValidationError());

Original pull request: #524.
This commit is contained in:
Christoph Strobl
2017-12-14 07:49:41 +01:00
committed by Mark Paluch
parent ddc6e4a219
commit 14ccb5152a
21 changed files with 4840 additions and 17 deletions

View File

@@ -5,6 +5,8 @@
== What's new in Spring Data MongoDB 2.1
* Cursor-based aggregation execution.
* <<mongo-template.query.distinct,Distinct queries>> for imperative and reactive Template API.
* `validator` support for collections.
* `$jsonSchema` support for queries.
[[new-features.2-0-0]]
== What's new in Spring Data MongoDB 2.0

View File

@@ -1464,6 +1464,33 @@ AggregationResults<TagCount> results = template.aggregate(aggregation, "tags", T
WARNING: Indexes are only used if the collation used for the operation and the index collation matches.
[[mongo.jsonSchema]]
=== JSON Schema
As of version 3.6 MongoDB supports collections that validate ``Document``s against a provided JSON Schema. The schema itself and both validation action and level can be defined when creating the collection.
`CollectionOptions` provides the entry point to schema support for collections.
.Create collection with `$jsonSchema`
====
[source,java]
----
// TODO: add sample here!
----
====
Additionally it is also possible to query any collection for documents that match a given structure defined by a JSON Schema.
.Query collation for Documents matching a `$jsonSchema`
====
[source,java]
----
// TODO: add sample here!
----
====
NOTE: `$jsonSchema` can only be applied on the top level of a query and not property specific. Use the `properties` attribute of the schema to match against nested fields.
[[mongo.query.fluent-template-api]]
=== Fluent Template API