Reading Documents RESTHeart Cloud
This page demonstrates how to query MongoDB collections through RESTHeart’s REST API using the GET method.
🔧 Configuration
⚡ Setup Guide
To run the examples on this page, you need a RESTHeart instance.
Option 1: Use RESTHeart Cloud (Recommended)
The fastest way to get started is with RESTHeart Cloud. Create a free service in minutes:
-
Sign up at cloud.restheart.com
-
Create a free API service
-
Set up your root user following the Root User Setup guide
-
Use the configuration panel above to set your service URL and credentials
|
Tip
|
All code examples on this page will automatically use your configured RESTHeart Cloud credentials. |
Option 2: Run RESTHeart Locally
If you prefer local development, follow the Setup Guide to install RESTHeart on your machine.
|
Note
|
Local instances run at http://localhost:8080 with default credentials admin:secret
|
Create the Inventory Collection
The example requests on this page use the inventory collection. If not already created, run the following:
cURL
curl -i -X PUT [INSTANCE-URL]/inventory -H "Authorization: Basic [BASIC-AUTH]"
curl -i -X POST [INSTANCE-URL]/inventory?wm=upsert -H "Authorization: Basic [BASIC-AUTH]" \
-d '[
{ "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
{ "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
{ "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
{ "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
{ "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
]'
HTTPie
http PUT [INSTANCE-URL]/inventory Authorization:"Basic [BASIC-AUTH]"
echo '[
{ "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
{ "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
{ "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
{ "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
{ "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
]' | http POST [INSTANCE-URL]/inventory wm==upsert Authorization:"Basic [BASIC-AUTH]"
JavaScript
const data = [
{ "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
{ "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
{ "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
{ "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
{ "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
];
await fetch('[INSTANCE-URL]/inventory', {
method: 'PUT',
headers: { 'Authorization': 'Basic [BASIC-AUTH]' }
});
await fetch('[INSTANCE-URL]/inventory?wm=upsert', {
method: 'POST',
body: JSON.stringify(data),
headers: { 'Authorization': 'Basic [BASIC-AUTH]' }
});
Basic Document Retrieval
To retrieve documents from a collection, send a GET request to the collection URI:
cURL
curl -i -X GET [RESTHEART-URL]/inventory \
-H "Authorization: Basic [BASIC-AUTH]"
HTTPie
http GET [RESTHEART-URL]/inventory \
Authorization:"Basic [BASIC-AUTH]"
JavaScript
fetch('[RESTHEART-URL]/inventory', {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
This returns all documents in the collection, subject to pagination limits.
Pagination
RESTHeart always paginates results to prevent performance issues with large collections. By default, only 100 documents are returned per request.
Control pagination with these query parameters:
-
page: Which page of results to return (starting from 1) -
pagesize: Number of documents per page (1-1000, default is 100)
Example - get the second page with 3 documents per page:
cURL
curl -i -X GET [RESTHEART-URL]/inventory?page=2&pagesize=3 \
-H "Authorization: Basic [BASIC-AUTH]"
HTTPie
http GET [RESTHEART-URL]/inventory \
Authorization:"Basic [BASIC-AUTH]" \
page==2 \
pagesize==3
JavaScript
fetch('[RESTHEART-URL]/inventory?page=2&pagesize=3', {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
Filtering Documents
Use the filter parameter to specify which documents to return using MongoDB query syntax:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory" \
-H "Authorization: Basic [BASIC-AUTH]" \
-G --data-urlencode 'filter={"qty":{"$gt":50}}'
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
filter=="{\"qty\":{\"\$gt\":50}}"
JavaScript
const filter = encodeURIComponent('{"qty":{"$gt":50}}');
fetch(`[RESTHEART-URL]/inventory?filter=${filter}`, {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
This returns only documents where the quantity is greater than 50.
Complex Filters
Combine multiple conditions using MongoDB operators like $and:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory" \
-H "Authorization: Basic [BASIC-AUTH]" \
-G --data-urlencode 'filter={"$and":[{"qty":{"$gt":75}},{"status":"D"}]}'
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
filter=="{\"\$and\":[{\"qty\":{\"\$gt\":75}},{\"status\":\"D\"}]}"
JavaScript
const filter = encodeURIComponent('{"$and":[{"qty":{"$gt":75}},{"status":"D"}]}');
fetch(`[RESTHEART-URL]/inventory?filter=${filter}`, {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
Alternatively, you can use multiple filter parameters:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory" \
-H "Authorization: Basic [BASIC-AUTH]" \
-G --data-urlencode 'filter={"qty":{"$gt":75}}' \
--data-urlencode 'filter={"status":"D"}'
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
filter=="{\"qty\":{\"\$gt\":75}}" \
filter=="{\"status\":\"D\"}"
JavaScript
fetch('[RESTHEART-URL]/inventory?filter={"qty":{"$gt":75}}&filter={"status":"D"}', {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
Counting Documents
Instead of retrieving documents, you can count them by appending _size to the collection URI:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory/_size" \
-H "Authorization: Basic [BASIC-AUTH]" \
-G --data-urlencode 'filter={"status":"A"}'
HTTPie
http GET "[RESTHEART-URL]/inventory/_size" \
Authorization:"Basic [BASIC-AUTH]" \
filter=="{\"status\":\"A\"}"
JavaScript
const filter = encodeURIComponent('{"status":"A"}');
fetch(`[RESTHEART-URL]/inventory/_size?filter=${filter}`, {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
This returns the count of documents with status "A".
Projection (Selecting Fields)
Use the keys parameter to specify which fields to include or exclude from the results:
Include only specific fields
cURL
curl -i -X GET "[RESTHEART-URL]/inventory" \
-H "Authorization: Basic [BASIC-AUTH]" \
-G --data-urlencode "keys={'item':1}"
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
keys=="{'item':1}"
JavaScript
const keys = encodeURIComponent("{'item':1}");
fetch(`[RESTHEART-URL]/inventory?keys=${keys}`, {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
This returns only the _id and item fields for each document.
Exclude specific fields
cURL
curl -i -X GET "[RESTHEART-URL]/inventory" \
-H "Authorization: Basic [BASIC-AUTH]" \
-G --data-urlencode "keys={'item':0}"
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
keys=="{'item':0}"
JavaScript
const keys = encodeURIComponent("{'item':0}");
fetch(`[RESTHEART-URL]/inventory?keys=${keys}`, {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
This returns all fields except item for each document.
Include multiple specific fields
cURL
curl -i -X GET "[RESTHEART-URL]/inventory" \
-H "Authorization: Basic [BASIC-AUTH]" \
-G --data-urlencode "keys={'item':1}" \
-G --data-urlencode "keys={'qty':1}"
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
keys=="{'item':1}" \
keys=="{'qty':1}"
JavaScript
fetch('[RESTHEART-URL]/inventory?keys={"item":1}&keys={"qty":1}', {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
This returns only the _id, item, and qty fields.
Sorting Results
Control the order of results with the sort parameter:
Simple Format
For simple sorting, use sort=fieldname for ascending order or sort=-fieldname for descending order:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory?sort=status" \
-H "Authorization: Basic [BASIC-AUTH]"
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
sort==status
JavaScript
fetch('[RESTHEART-URL]/inventory?sort=status', {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
This sorts documents by status in ascending order.
For descending order:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory?sort=-status" \
-H "Authorization: Basic [BASIC-AUTH]"
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
sort==-status
JavaScript
fetch('[RESTHEART-URL]/inventory?sort=-status', {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
Multiple Fields Sorting
Use multiple sort parameters to sort by multiple fields:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory?sort=status&sort=-qty" \
-H "Authorization: Basic [BASIC-AUTH]"
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
sort==status \
sort==-qty
JavaScript
fetch('[RESTHEART-URL]/inventory?sort=status&sort=-qty', {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
This sorts first by status (ascending) and then by quantity (descending).
JSON Expression Format
You can also use MongoDB’s sort expression format:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory" \
-H "Authorization: Basic [BASIC-AUTH]" \
-G --data-urlencode 'sort={"status":1,"qty":-1}'
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
sort=="{\"status\":1,\"qty\":-1}"
JavaScript
const sort = encodeURIComponent('{"status":1,"qty":-1}');
fetch(`[RESTHEART-URL]/inventory?sort=${sort}`, {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
Accessing Nested Properties
Use dot notation to access nested document fields or array elements:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory" \
-H "Authorization: Basic [BASIC-AUTH]" \
-G --data-urlencode "keys={'size.h':1}" \
-G --data-urlencode "sort={'size.uom':1}"
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
keys=="{'size.h':1}" \
sort=="{'size.uom':1}"
JavaScript
const keys = encodeURIComponent("{'size.h':1}");
const sort = encodeURIComponent("{'size.uom':1}");
fetch(`[RESTHEART-URL]/inventory?keys=${keys}&sort=${sort}`, {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
This returns only the height field from the size subdocument and sorts by the unit of measure.
Using Indexes with Hint
Override MongoDB’s default index selection with the hint parameter:
Create Indexes First
Before using hints, create the indexes:
cURL
curl -i -X PUT "[RESTHEART-URL]/inventory/_indexes/item" \
-H "Authorization: Basic [BASIC-AUTH]" \
-H "Content-Type: application/json" \
-d '{"keys": {"item": 1}}'
HTTPie
echo '{"keys": {"item": 1}}' | \
http PUT "[RESTHEART-URL]/inventory/_indexes/item" \
Authorization:"Basic [BASIC-AUTH]" \
Content-Type:application/json
JavaScript
fetch('[RESTHEART-URL]/inventory/_indexes/item', {
method: 'PUT',
headers: {
'Authorization': 'Basic [BASIC-AUTH]',
'Content-Type': 'application/json'
},
body: JSON.stringify({"keys": {"item": 1}})
})
.then(response => {
if (response.ok) {
console.log('Write request executed successfully');
} else {
console.error('Write request failed:', response.status);
}
})
.catch(error => console.error('Error:', error));
cURL
curl -i -X PUT "[RESTHEART-URL]/inventory/_indexes/status" \
-H "Authorization: Basic [BASIC-AUTH]" \
-H "Content-Type: application/json" \
-d '{"keys":{"status": 1}}'
HTTPie
echo '{"keys":{"status": 1}}' | \
http PUT "[RESTHEART-URL]/inventory/_indexes/status" \
Authorization:"Basic [BASIC-AUTH]" \
Content-Type:application/json
JavaScript
fetch('[RESTHEART-URL]/inventory/_indexes/status', {
method: 'PUT',
headers: {
'Authorization': 'Basic [BASIC-AUTH]',
'Content-Type': 'application/json'
},
body: JSON.stringify({"keys":{"status": 1}})
})
.then(response => {
if (response.ok) {
console.log('Write request executed successfully');
} else {
console.error('Write request failed:', response.status);
}
})
.catch(error => console.error('Error:', error));
Using Hint
Specify which index to use:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory" \
-G --data-urlencode "hint={'item':1}" \
-H "Authorization: Basic [BASIC-AUTH]"
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
hint=="{'item':1}"
JavaScript
const hint = encodeURIComponent("{'item':1}");
fetch(`[RESTHEART-URL]/inventory?hint=${hint}`, {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
Or use the compact string format:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory?hint=%2Bitem&hint=-status" \
-H "Authorization: Basic [BASIC-AUTH]"
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
hint=="+item" \
hint=="-status"
JavaScript
fetch('[RESTHEART-URL]/inventory?hint=%2Bitem&hint=-status', {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
|
Note
|
When using the + sign in URLs, encode it as %2B to prevent it being interpreted as a space.
|
Special Query Operations
Collection Scan
Force a collection scan instead of using indexes:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory" \
-G --data-urlencode "hint={'$natural':1}" \
-H "Authorization: Basic [BASIC-AUTH]"
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
hint=="{'%24natural':1}"
JavaScript
const hint = encodeURIComponent("{'$natural':1}");
fetch(`[RESTHEART-URL]/inventory?hint=${hint}`, {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
For a reverse collection scan:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory" \
-G --data-urlencode "hint={'$natural':-1}" \
-H "Authorization: Basic [BASIC-AUTH]"
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
hint=="{'%24natural':-1}"
JavaScript
const hint = encodeURIComponent("{'$natural':-1}");
fetch(`[RESTHEART-URL]/inventory?hint=${hint}`, {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));
Text Search
If you have a text index, you can perform text searches:
First, create the text index:
cURL
curl -i -X PUT "[RESTHEART-URL]/inventory/_indexes/text" \
-H "Authorization: Basic [BASIC-AUTH]" \
-H "Content-Type: application/json" \
-d '{"keys": {"item": "text"}}'
HTTPie
echo '{"keys": {"item": "text"}}' | \
http PUT "[RESTHEART-URL]/inventory/_indexes/text" \
Authorization:"Basic [BASIC-AUTH]" \
Content-Type:application/json
JavaScript
fetch('[RESTHEART-URL]/inventory/_indexes/text', {
method: 'PUT',
headers: {
'Authorization': 'Basic [BASIC-AUTH]',
'Content-Type': 'application/json'
},
body: JSON.stringify({"keys": {"item": "text"}})
})
.then(response => {
if (response.ok) {
console.log('Write request executed successfully');
} else {
console.error('Write request failed:', response.status);
}
})
.catch(error => console.error('Error:', error));
Then search and sort by relevance score:
cURL
curl -i -X GET "[RESTHEART-URL]/inventory" \
-H "Authorization: Basic [BASIC-AUTH]" \
-G --data-urlencode 'filter={"$text":{"$search":"paper"}}' \
-G --data-urlencode 'keys={"item":1,"score":{"$meta":"textScore"}}' \
-G --data-urlencode 'sort={"score":{"$meta":"textScore"}}'
HTTPie
http GET "[RESTHEART-URL]/inventory" \
Authorization:"Basic [BASIC-AUTH]" \
filter=="{\"\$text\":{\"\$search\":\"paper\"}}" \
keys=="{\"item\":1,\"score\":{\"\$meta\":\"textScore\"}}" \
sort=="{\"score\":{\"\$meta\":\"textScore\"}}"
JavaScript
const filter = encodeURIComponent('{"$text":{"$search":"paper"}}');
const keys = encodeURIComponent('{"item":1,"score":{"$meta":"textScore"}}');
const sort = encodeURIComponent('{"score":{"$meta":"textScore"}}');
fetch(`[RESTHEART-URL]/inventory?filter=${filter}&keys=${keys}&sort=${sort}`, {
headers: {
'Authorization': 'Basic [BASIC-AUTH]'
}
})
.then(response => response.json())
.then(data => {
console.log('Retrieved data:', data);
})
.catch(error => console.error('Error:', error));