Queries
Introduction
In RESTHeart, GET
collection resource requests
(GET /db/coll
) retrieve documents from the collection as embedded
resources.
Refer to Representation Format for more information about the representation format.
This section also applies to File Bucket and Schema Store resources, that embed File and JSON schema resources respectively.
Example
To retrieve the first 100 documents of a collection:
Request
GET /test/coll?pagesize=100&np
Response (headers omitted)
HTTP/1.1 200 OK
...
{
"_embedded": [
{ <DOC1> }, { <DOC2> }, { <DOC3> }, ..., { <DOC100> }
],
"_returned": 100
}
Excluding collection properties
The query parameter np
(No Properties) excludes the collection
properties from the response.
Default sorting
The default sorting of the documents is by the _id
descending.
In the usual case, where the type of the ids of the documents is ObjectId, this makes the documents sorted by creation time by default (ObjectId have a timestamp in the most significant bits).
RESTHeart returns data in pages (default being 100) and it is stateless. This means that two requests use different db cursors. A default sorting makes sure that requests on different pages returns documents in a well defined order.
Disable default sorting
Default sorting could impact performances for some use cases.
To disable default sorting just add the sort={}
query parameter
See the sorting section to know how to specify different sorting criteria.
Filtering
The filter
query parameter allows to specify conditions on the
documents to be returned.
The filter
qparam value is any mongodb
query.
Note that system properties (properties starting with _ that are managed automatically by RESTHeart) are not affected by this option.
Filtering Examples
Return documents whose title
starts with “Star Trek”
GET /test/coll?filter={'title':{'$regex':'(?i)^STAR TREK.*'}}
This query uses the mongodb $regex operator where the i option performs a case-insensitive match for documents with title value that starts with the string “STAR TREK”.
Return documents whose title
starts with “Star Trek” and publishing_date
is later than 4/9/2015, 8AM
GET /test/coll?filter={'$and':[{'title':{'$regex':'(?i)^STAR TREK.*'},{'publishing_date':{'$gte':{'$date':'2015-09-04T08:00:00Z'}}}]}
or
GET /test/coll?filter={'title':{'$regex':'(?i)^STAR TREK.*'}&filter={'publishing_date':{'$gte':{'$date':'2015-09-04T08:00:00Z'}}}
multifilter qparams
Note the second form of the last example. If multiple filter query parameters are specified, they are logically composed with the AND operator.
This can be very useful in conjunction with path based security permission.
For instance the following permission can be used with the simple file based Access Manager to restrict users to GET a collection only specifying a filter on the author property to be equal to their username:
regex[pattern="/test/coll/\?.*filter={'author':'(.*?)'}.*", value="%R", full-match=true] and equals[%u, "${1}"]
Counting
Specifying the count query parameter (e.g. ?count=true
), RESTHeart
returns:
- the total number of documents in the collection with the
_size
parameter - the total number of available pages with
the
_total_pages
parameter. It also add thelast
link, i.e. the link to the last page, to the _links; The pagination links (first, last, next, previous) are only returned on hal full mode (hal=f query parameter); see HAL mode for more information.
Impact on performances
count
involves querying the collection twice: once for counting
and once of actually retrieving the data; this has performance
implications!
Paging
Embedded documents are always paginated, i.e. only a subset of the collection’s document is returned on each request.
The number of documents to return is controlled via the pagesize
query
parameter. Its default value is 100, maximum allowable size is 1000.
The pages to return is specified with the page
query parameter. The
pagination links (first, last, next, previous) are only returned on
hal full mode (hal=f
query parameter); see HAL
mode
for more information.
For instance, to return documents from 20 to 29 (page 3):
Request
GET /test/coll?count&page=3&pagesize=10&hal=f&np
Response (headers omitted)
HTTP/1.1 200 OK
...
{
"_embedded": [
{ <DOC30> }, { <DOC31> }, ... { <DOC39> }
],
"_returned": 10,
"_size": 343
"_total_pages": 35
}
Sorting
Sorting is controlled by the sort
query parameter.
Note that documents cannot be sorted by system properties (properties starting with _ that are managed automatically by RESTHeart).
Sort simple format
The sort
simplified format is :
sort=[ |-]<fieldname>
multiple sort properties
Specify multiple sort options using multiple sort
query parameters
GET /db/coll?sort=name&sort=-age
Sort JSON expression format
sort
can also be a MongoDB sort
expression.
JSON expression format is available starting from version 2.0.1. See improvement RH-190
sort={"field": 1}
Sorting Examples
Sort by the date ascending
GET /test/coll?sort=date
GET /test/coll?sort={"date":1}
Sort by the date descending
GET /test/coll?sort=-date
GET /test/coll?sort={"date":-1}
Sort by the date descending and title ascending
GET /test/coll?sort=-date&sort=title
GET /test/coll?sort={"date":-1, "title":1}
Sort by search score
This is only possible with json expression format
// create a text index
PUT /test/coll/_indexes/text {"keys": {"title": "text }}
// sort by {"$meta": "textScore"}
GET /test/coll?filter={"$text":{"$search":"a search string"}}&keys={"title":1,"score":{"$meta":"textScore"}}&sort={"score":{"$meta":"textScore"}}
Projection
Projection limits the fields to return for all matching documents, specifying the inclusion or the exclusion of fields.
This is done via the keys
query parameter.
Note that system properties (properties starting with _ that are managed automatically by RESTHeart) are not affected by this option.
Projection Examples
Only return the property title
GET /test/coll?keys={'title':1}
Return all but the property title
GET /test/coll?keys={'title':0}
Only return the properties title and summary
GET /test/coll?keys={'title':1}&keys={'summary':1}
It’s possible to use the “dot notation” to specify fields within an object, for example, let’s say that both title and summary are part of an header object:
GET /test/coll?keys={'header.title':1}&keys={'header.summary':1}
Hint
Hint allows overriding MongoDB’s default index selection and query optimization process. See cursor hint on MongoDB documentation.
This is done via the hint
query parameter.
Specify the index by the index specification document, either using a json document or the compact string representation; specifying the index by name is not supported.
Use $natural
to force the query to perform a forwards collection scan.
Hint Examples
Use the index on age field
The following example returns all documents in the collection named coll using the index on the age field.
GET /test/coll?hint={'age':1}
Use the compound index on age and timestamp fields using the compact string format
The following example returns the documents in the collection named coll using the compound index on the age and reverse timestamp fields.
GET /test/coll?hint=age&hint=-timestamp
Perform a forwards collection scan
The following example returns the documents in the collection named coll using aforwards collection scan.
GET /test/coll?hint={'$natural':1}
Perform a reverse collection scan
The following example returns the documents in the collection named coll using a reverse collection scan.
GET /test/coll?hint={'$natural':-1}