Representation Format
Representation Format
The following table summarizes how resources are represented
resource | represented as | example |
---|---|---|
root / |
paginated array of existing db names | ["db1", "db2"] |
db /<db-name> |
paginated array of collection/buckets names that exist in the db | ["collection1", "file.bucket"] |
collection <db-name>/<collection-name> |
paginated array of documents of the collection | [ {"_id": "doc1, "foo": "bar" }, {"_id": "doc2, "foo": "bar" } ] |
document | JSON object | {"_id": "doc1, "foo": "bar" } |
BSON types
MongoDB uses the BSON data format which type system is a superset of JSON’s. To preserve type information, MongoDB adds this extension to the JSON.
For instance, the _id
of the following JSON document is an ObjectId.
{
"_id": {
"$oid": "5d0b4e325beb2029a8d1bd5e"
},
"item": "paper"
...
}
The strict mode is used on both request and response resource representation and also on the query parameter filter
The following filter
won’t find the document since the _id
is an ObjectId (and not a String).
GET /inventory?filter={'_id':'5d0b4e325beb2029a8d1bd5e'} HTTP/1.1
The correct request is:
GET /inventory?filter={'_id':{'$oid':'5d0b4e325beb2029a8d1bd5e'}} HTTP/1.1
JSON Mode
JSON Mode is available from RESTHeart v4.1
JSON can only directly represent a subset of the types supported by BSON. To preserve type information, RESTHeart adds the following extensions to the JSON format.
The query parameter jsonMode
allows to specify the JSON Mode
jsonMode | Description |
---|---|
none | Standard RESTHeart representation |
STRICT | JSON representation with type information for specific cases |
EXTENDED | Extended JSON representation with full type information |
RELAXED | Standard relaxed extended JSON representation |
SHELL | This output mode will attempt to produce output that corresponds to what the MongoDB shell actually produces when showing query results |
Standard RESTHeart representation
GET locahost:8080/coll/5d7a4b59cf6eeb5fb1686613 HTTP/1.1
{
"_etag": {
"$oid": "5d7a4f10af0e1b77a7731d05"
},
"_id": {
"$oid": "5d7a4b59cf6eeb5fb1686613"
},
"a": 1,
"b": 1.0,
"big": 1568295769260,
"timestamp": {
"$date": 1568295769260
}
}
Strict representation
GET locahost:8080/coll/5d7a4b59cf6eeb5fb1686613?jsonMode=strict HTTP/1.1
HTTP/1.1 200 OK
{
"_etag": {
"$oid": "5d7a4f10af0e1b77a7731d05"
},
"_id": {
"$oid": "5d7a4b59cf6eeb5fb1686613"
},
"a": 1,
"b": 1.0,
"big": {
"$numberLong": "1568295769260"
},
"timestamp": {
"$date": 1568295769260
}
}
Extended representation
GET locahost:8080/coll/5d7a4b59cf6eeb5fb1686613?jsonMode=extended HTTP/1.1
HTTP/1.1 200 OK
{
"_etag": {
"$oid": "5d7a4f10af0e1b77a7731d05"
},
"_id": {
"$oid": "5d7a4b59cf6eeb5fb1686613"
},
"a": {
"$numberInt": "1"
},
"b": {
"$numberDouble": "1.0"
},
"big": {
"$numberLong": "1568295769260"
},
"timestamp": {
"$date": {
"$numberLong": "1568295769260"
}
}
}
Relaxed representation
GET locahost:8080/coll/5d7a4b59cf6eeb5fb1686613?jsonMode=relaxed HTTP/1.1
HTTP/1.1 200 OK
{
"_etag": {
"$oid": "5d7a6c61bd8a0d69516bbf55"
},
"_id": {
"$oid": "5d7a4b59cf6eeb5fb1686613"
},
"a": 1,
"b": 1.0,
"big": 1568295769260,
"timestamp": {
"$date": "2019-09-12T13:42:49.26Z"
}
}
Shell representation
SHELL JSON Mode is very useful since it allows to use the response body directly in the mongoshell!
GET locahost:8080/coll/5d7a4b59cf6eeb5fb1686613?jsonMode=shell HTTP/1.1
HTTP/1.1 200 OK
Content-Type: application/javascript
{"_id":ObjectId("5d7a4b59cf6eeb5fb1686613"),"_etag":ObjectId("5d7a6d13bd8a0d69516bbf56"),"timestamp":ISODate("2019-09-12T13:42:49.260Z"),"a":1,"b":1.0,"big":NumberLong("1568295769260"),"verybig":NumberLong("5887391606")}
Other representation formats
RESTHeart has different options for representing the resources: STANDARD
, HAL
and SHAL
(Simplified HAL).
HAL
and SHAL
are deprecated in version 6.0 and will likely be removed in a future release.
The default representation can be controlled by the configuration option default-representation-format
.
default-representation-format: STANDARD
The rep
query parameter can also be used for switching between representations.
GET /inventory?rep=s HTTP/1.1
GET /inventory?rep=hal HTTP/1.1
GET /inventory?rep=shal HTTP/1.1
HAL
HAL up on 2 simple concepts: Resources and Links
- Resources have state (plain JSON), embedded resources and links
- Links have target (href URI) and relations (aka rel)
Example
We’ll get the inventory
collection resource and analyze it.
A collection represented with HAL
has its own properties, embedded resources (in this case, documents) and link templates (for pagination, sorting, etc).
GET /inventory?rep=hal HTTP/1.1
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Location, ETag, X-Powered-By
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 384
Content-Type: application/hal+json
Date: Mon, 08 Jul 2019 12:56:14 GMT
ETag: 5d233840dd860b259a3bad45
X-Powered-By: restheart.org
{
"_id":"inventory",
"_etag":{
"$oid":"5d233840dd860b259a3bad45"
},
"metadata_field": "metadata_value",
"_returned": 6,
"_embedded":{
"rh:doc":[
{
"_id":{
"$oid":"5d233aeb93dc53162739e172"
},
"_etag":{
"$oid":"5d233aeb93dc53162739e16d"
},
"item":"postcard",
"qty":45,
"size":{
"h":10,
"w":15.25,
"uom":"cm"
},
"status":"A"
},
...
]
}
}
Properties
In this case, the collection properties comprise the field metadata_field; this is user defined.
The other fields are reserved properties (i.e. are managed automatically by RESTHeart for you); these always starts with _:
Property | Description |
---|---|
_type |
the type of this resource. in this case ‘COLLECTION’ (only returned on HAL full mode) |
_id |
the name of the collection |
_etag |
entity tag, used for caching and to avoid ghost writes. |
_returned |
the number of the documents embedded in this representation |
Documents as embedded resources
Collection’s embedded resources are the collection documents, recursively represented as HAL documents.
The _embedded
property looks like:
{
"_embedded": {
"rh:doc": [
{
"_id": {
"$oid": "5d233aeb93dc53162739e172"
},
"_etag": {
"$oid": "5d233aeb93dc53162739e16d"
},
"item": "postcard",
"qty": 45,
"size": {
"h": 10,
"w": 15.25,
"uom": "cm"
},
"status": "A"
},
{
"_id": {
"$oid": "5d233aeb93dc53162739e171"
},
"_etag": {
"$oid": "5d233aeb93dc53162739e16d"
},
"item": "planner",
"qty": 75,
"size": {
"h": 22.85,
"w": 30,
"uom": "cm"
},
"status": "D"
}
]
}
}
Links
_links
are only returned on hal full mode. The only exception are with
relationships. If a collection defines a relationship,
the representation of the documents always include the links to related
data.
Link | Description |
---|---|
self |
link to itself |
first |
link to the first page |
last |
link to the last page |
rh:db |
templated link for db |
rh:coll |
templated link for collection |
rh:document |
templated link for document |
rh:filter |
templated link for filtering |
rh:sort |
templated link for sorting |
rh:indexes |
link to the collection indexes resource |
rh:paging |
templated link for paging |
curies |
(compacts URIes) bind links to documentation. For instance the rh:db rel is documented at https://restheart.org/curies/2.0/db.html |
The _links
property looks like:
{ "_links": {
"self": {
"href": "/inventory?hal=f"
},
"first": {
"href": "/inventory?pagesize=100&hal=f"
},
"next": {
"href": "/inventory?page=2&pagesize=100&hal=f"
},
"rh:coll": {
"href": "//{collname}",
"templated": true
},
"rh:document": {
"href": "/inventory/{docid}{?id_type}",
"templated": true
},
"rh:indexes": {
"href": "/inventory/_indexes"
},
"rh:filter": {
"href": "/inventory{?filter}",
"templated": true
},
"rh:sort": {
"href": "/inventory{?sort_by}",
"templated": true
},
"rh:paging": {
"href": "/inventory{?page}{&pagesize}",
"templated": true
}
}
HAL Mode
The query parameter hal
controls the verbosity of HAL representation.
Valid values are hal=c
(for compact) and hal=f
(for full); the default value
(if the param is omitted) is compact mode.
When hal=f
is specified, the representation is more verbose and includes special properties (such as links).
Simplified HAL
Up to RESTHeart 3.x SHAL was also called PLAIN_JSON
In the following response the collection /inventory has the properties _id
, _etag
, metadata_field
and two embedded documents and the special property _returned
GET /inventory?rep=shal HTTP/1.1
HTTP/1.1 200 OK
...
{
"_embedded": [
{
"_id": {
"$oid": "5d0b4dff2ec9ff0d92ddc2b7"
},
"_etag": {
"$oid": "5d0b4dff2ec9ff0d92ddc2b2"
},
"item": "postcard",
"qty": 45,
"size": {
"h": 10,
"w": 15.25,
"uom": "cm"
},
"status": "A"
}
],
"_id": "inventory",
"_etag": {
"$oid": "5d1e13dbdde87c62e98a4595"
},
"metadata_field": "metadata_value",
"_returned": 6
}