Write Requests
Introduction
This document shows how RESTHeart can use the PUT
, POST
, PATCH
and
DELETE
verbs to create, modify and delete resources within a MongoDB
database, using only the HTTP protocol.
Before running the example requests
The following step by step tutorial assumes that RESTHeart is running on localhost with the default configuration: the database restheart is bound to /
and the user admin exists with default password secret.
To run RESTHeart please first read the setup section.
To create the restheart db, run the following:
PUT / HTTP/1.1
The examples on this page use the inventory collection. To create the inventory collection, run the following:
PUT /inventory HTTP/1.1
To populate the inventory collection, run the following:
POST /inventory HTTP/1.1
[
{ "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" }
]
Write Verbs
The following table summarizes the semantic of the write verbs:
verb | semantic |
---|---|
PUT |
Upserts the resource identified by the request URL:
|
POST |
Upserts a resource under the resource identified by the request URL:
The resource to upsert is identified by the _id property of the request JSON body. If the request body does not include it, the _id it is auto generated as a new ObjectId and the URL of the new document is returned in the response via the Location header.
|
PATCH |
While
|
DELETE |
Deletes the resource identified by the request URL. |
Upsert
The term upsert means either to create a resource, if it does not already exist or to update it, if it does. It comes from joining the terms update and insert.
Basic Examples
Create a document with a given “newItem” Id
PUT /inventory/newItem HTTP/1.1
{ "item": "pencil", "qty": 55, "size": { "h": 10, "w": 0.5, "uom": "cm" }, "status": "B", "suppliers": ["brand_1", "brand_2", "brand_3"] }
Create a document without a given Id
POST /inventory HTTP/1.1
{ "item": "rubber", "qty": 15, "size": { "h": 2, "w": 1, "uom": "cm" }, "status": "A" }
Edit “newItem” document’s property “status”
PATCH /inventory/newItem HTTP/1.1
{ "status": "A" }
Dot Notation
RESTHeart uses the dot notation to access the elements of an array and to access the fields of an embedded document.
The dot notation can be used in PUT
, PATCH
and POST
verbs.
Dot Notation Examples
Edit “newItem” document’s array element “supplier[1]”
PATCH /inventory/newItem HTTP/1.1
{"suppliers.1": "new_brand" }
Edit “newItem.size” embedded document’s “h” property
PATCH /inventory/newItem HTTP/1.1
{"size.h": 20 }
Update Operators
Refer to MongoDB Update Operators documentation for more information.
RESTHeart allows to use all MongoDB update operators on PATCH
requests.
PUT
and POST
can only use $currentDate
update operator.
Update Operators Examples
Apply given update operators to “newItem” document
PATCH /inventory/newItem HTTP/1.1
{
"$inc": { "qty": 1 },
"$push": { "suppliers": "pushed_brand" },
"$unset": { "status": null },
"$currentDate": { "timestamp": true }
}
The request above will:
- increment the properties qty using the $inc field operator
- add a new item to the suppliers using the $push array operator
- remove the property status using the $unset field operator
- update the timestamp with the current date using the $currentDate operator
Bulk Write Requests
Bulk write requests create, update or delete multiple documents with a single request.
A bulk request response contains the URIs of the created documents.
All the upserted documents have the same _etag property value as reported in the ETag response header. To retrieve the upserted documents with a single request GET the collection filtering on the _etag property.
Bulk Write Requests Examples
POST an array of documents
POST /inventory HTTP/1.1
[
{ "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" }
]
The bulk POST has the same behavior of PATCH: only the properties in the request data will be updated. POSTing documents containing existing _ids will update the them (and not replace the existing onces at all).
PATCH multiple documents with “qty” property greater than (or that equals) 50 using the wildcard document id
PATCH /inventory/*?filter={"qty":{"$gte":50}} HTTP/1.1
{
"qty":1000
}
DELETE multiple documents with “qty” property less than (or that equals) 50 using the wildcard document id
DELETE /inventory/*?filter={"qty":{"$lte":50}} HTTP/1.1