HTTP interface for documents
The HTTP API for documents lets you create, read, update, and delete documents in collections, either one or multiple at a time
The basic operations for documents are mapped to the standard HTTP methods:
- Create:
POST
- Read:
GET
- Update:
PATCH
(partially modify) - Replace:
PUT
- Delete:
DELETE
- Check:
HEAD
(test for existence and get document metadata)
Addresses of documents
Any document can be retrieved using its unique URI:
http://server:port/_api/document/<document-identifier>
For example, assuming that the document identifier is demo/362549736
, then the URL
of that document is:
http://localhost:8529/_api/document/demo/362549736
The above URL schema does not specify a database name
explicitly, so the default _system
database is used. To explicitly specify the
database context, use the following URL schema:
http://server:port/_db/<database-name>/_api/document/<document-identifier>
For example, using the a database called mydb
:
http://localhost:8529/_db/mydb/_api/document/demo/362549736
Many examples in the documentation use the short URL format (and thus the _system
database) for brevity.
Multiple documents in a single request
The document API can handle not only single documents but multiple documents in a single request. This is crucial for performance, in particular in the cluster situation, in which a single request can involve multiple network hops within the cluster. Another advantage is that it reduces the overhead of the HTTP protocol and individual network round trips between the client and the server. The general idea to perform multiple document operations in a single request is to use a JSON array of objects in the place of a single document. As a consequence, document keys, identifiers and revisions for preconditions have to be supplied embedded in the individual documents given. Multiple document operations are restricted to a single collection (document collection or edge collection).
Note that the GET
, HEAD
and DELETE
HTTP operations generally do
not allow to pass a message body. Thus, they cannot be used to perform
multiple document operations in one request. However, there are alternative
endpoints to request and delete multiple documents in one request.
Single document operations
Read document
reads a single document
GET /_api/document/{collection}/{key}
Path Parameters
-
collection (string, required): Name of the collection from which the document is to be read.
-
key (string, required): The document key.
Header Parameters
-
If-None-Match (string, optional): If the “If-None-Match” header is given, then it must contain exactly one Etag. The document is returned, if it has a different revision than the given Etag. Otherwise an HTTP 304 is returned.
-
If-Match (string, optional): If the “If-Match” header is given, then it must contain exactly one Etag. The document is returned, if it has the same revision as the given Etag. Otherwise a HTTP 412 is returned.
-
x-arango-allow-dirty-read (boolean, optional): Set this header to
true
to allow the Coordinator to ask any shard replica for the data, not only the shard leader. This may result in “dirty reads”.The header is ignored if this operation is part of a Stream Transaction (
x-arango-trx-id
header). The header set when creating the transaction decides about dirty reads for the entire transaction, not the individual read operations. -
x-arango-trx-id (string, optional): To make this operation a part of a Stream Transaction, set this header to the transaction ID returned by the
POST /_api/transaction/begin
call.
Returns the document identified by document-id. The returned document contains three special attributes: _id containing the document identifier, _key containing key which uniquely identifies a document in a given collection and _rev containing the revision.
Responses
HTTP 200: is returned if the document was found
HTTP 304: is returned if the “If-None-Match” header is given and the document has the same version
HTTP 404: is returned if the document or collection was not found
HTTP 412: is returned if an “If-Match” header is given and the found document has a different version. The response will also contain the found document’s current revision in the _rev attribute. Additionally, the attributes _id and _key will be returned.
Examples
Use a document identifier:
shell> curl --header 'accept: application/json' --dump - http://localhost:8529/_api/document/products/69547
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 76
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-w---_"
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Use a document identifier and an Etag:
shell> curl --header 'If-None-Match: "_fyvN-we---"' --header 'accept: application/json' --dump - http://localhost:8529/_api/document/products/69567
Unknown document identifier:
shell> curl --header 'accept: application/json' --dump - http://localhost:8529/_api/document/products/unknown-identifier
HTTP/1.1 404 Not Found
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 97
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Read document header
reads a single document head
HEAD /_api/document/{collection}/{key}
Path Parameters
-
collection (string, required): Name of the collection from which the document is to be read.
-
key (string, required): The document key.
Header Parameters
-
If-None-Match (string, optional): If the “If-None-Match” header is given, then it must contain exactly one Etag. If the current document revision is not equal to the specified Etag, an HTTP 200 response is returned. If the current document revision is identical to the specified Etag, then an HTTP 304 is returned.
-
If-Match (string, optional): If the “If-Match” header is given, then it must contain exactly one Etag. The document is returned, if it has the same revision as the given Etag. Otherwise a HTTP 412 is returned.
-
x-arango-allow-dirty-read (boolean, optional): Set this header to
true
to allow the Coordinator to ask any shard replica for the data, not only the shard leader. This may result in “dirty reads”.The header is ignored if this operation is part of a Stream Transaction (
x-arango-trx-id
header). The header set when creating the transaction decides about dirty reads for the entire transaction, not the individual read operations. -
x-arango-trx-id (string, optional): To make this operation a part of a Stream Transaction, set this header to the transaction ID returned by the
POST /_api/transaction/begin
call.
Like GET, but only returns the header fields and not the body. You can use this call to get the current revision of a document or check if the document was deleted.
Responses
HTTP 200: is returned if the document was found
HTTP 304: is returned if the “If-None-Match” header is given and the document has the same version
HTTP 404: is returned if the document or collection was not found
HTTP 412: is returned if an “If-Match” header is given and the found document has a different version. The response will also contain the found document’s current revision in the Etag header.
Examples
shell> curl -X HEAD --header 'accept: application/json' --dump - http://localhost:8529/_api/document/products/69557
Create document
creates documents
POST /_api/document/{collection}
Path Parameters
- collection (string, required):
Name of the
collection
in which the document is to be created.
Query Parameters
-
collection (string, optional): The name of the collection. This query parameter is only for backward compatibility. In ArangoDB versions < 3.0, the URL path was
/_api/document
and this query parameter was required. This combination still works, but the recommended way is to specify the collection in the URL path. -
waitForSync (boolean, optional): Wait until document has been synced to disk.
-
returnNew (boolean, optional): Additionally return the complete new document under the attribute
new
in the result. -
returnOld (boolean, optional): Additionally return the complete old document under the attribute
old
in the result. Only available if the overwrite option is used. -
silent (boolean, optional): If set to
true
, an empty object is returned as response if the document operation succeeds. No meta-data is returned for the created document. If the operation raises an error, an error object is returned.You can use this option to save network traffic.
-
overwrite (boolean, optional): If set to
true
, the insert becomes a replace-insert. If a document with the same_key
already exists, the new document is not rejected with unique constraint violation error but replaces the old document. Note that operations withoverwrite
parameter require a_key
attribute in the request payload, therefore they can only be performed on collections sharded by_key
. - overwriteMode (string, optional):
This option supersedes
overwrite
and offers the following modes:"ignore"
: if a document with the specified_key
value exists already, nothing is done and no write operation is carried out. The insert operation returns success in this case. This mode does not support returning the old document version usingRETURN OLD
. When usingRETURN NEW
,null
is returned in case the document already existed."replace"
: if a document with the specified_key
value exists already, it is overwritten with the specified document value. This mode is also used when no overwrite mode is specified but theoverwrite
flag is set totrue
."update"
: if a document with the specified_key
value exists already, it is patched (partially updated) with the specified document value. The overwrite mode can be further controlled via thekeepNull
andmergeObjects
parameters."conflict"
: if a document with the specified_key
value exists already, return a unique constraint violation error so that the insert operation fails. This is also the default behavior in case the overwrite mode is not set, and theoverwrite
flag isfalse
or not set either.
-
keepNull (boolean, optional): If the intention is to delete existing attributes with the update-insert command, the URL query parameter
keepNull
can be used with a value offalse
. This modifies the behavior of the patch command to remove any attributes from the existing document that are contained in the patch document with an attribute value ofnull
. This option controls the update-insert behavior only. -
mergeObjects (boolean, optional): Controls whether objects (not arrays) are merged if present in both, the existing and the update-insert document. If set to
false
, the value in the patch document overwrites the existing document’s value. If set totrue
, objects are merged. The default istrue
. This option controls the update-insert behavior only. - refillIndexCaches (boolean, optional): Whether to add a new entry to the in-memory edge cache if an edge document is inserted.
Request Body
(object, required)
A JSON representation of a single document.
Creates a new document from the document given in the body, unless there
is already a document with the _key
given. If no _key
is given, a new
unique _key
is generated automatically.
Possibly given _id
and _rev
attributes in the body are always ignored,
the URL part or the query parameter collection respectively counts.
If the document was created successfully, then the Location
header
contains the path to the newly created document. The Etag
header field
contains the revision of the document. Both are only set in the single
document case.
If silent
is not set to true
, the body of the response contains a
JSON object with the following attributes:
_id
contains the document identifier of the newly created document_key
contains the document key_rev
contains the document revision
If the collection parameter waitForSync
is false
, then the call
returns as soon as the document has been accepted. It does not wait
until the documents have been synced to disk.
Optionally, the query parameter waitForSync
can be used to force
synchronization of the document creation operation to disk even in
case that the waitForSync
flag had been disabled for the entire
collection. Thus, the waitForSync
query parameter can be used to
force synchronization of just this specific operations. To use this,
set the waitForSync
parameter to true
. If the waitForSync
parameter is not specified or set to false
, then the collection’s
default waitForSync
behavior is applied. The waitForSync
query
parameter cannot be used to disable synchronization for collections
that have a default waitForSync
value of true
.
If the query parameter returnNew
is true
, then, for each
generated document, the complete new document is returned under
the new
attribute in the result.
Responses
HTTP 201: is returned if the documents were created successfully and
waitForSync
was true
.
HTTP 202: is returned if the documents were created successfully and
waitForSync
was false
.
HTTP 400: is returned if the body does not contain a valid JSON representation of one document. The response body contains an error document in this case.
HTTP 404: is returned if the collection specified by collection
is unknown.
The response body contains an error document in this case.
HTTP 409: is returned in the single document case if a document with the same qualifiers in an indexed attribute conflicts with an already existing document and thus violates that unique constraint. The response body contains an error document in this case.
Examples
Create a document in a collection named products
. Note that the
revision identifier might or might not by equal to the auto-generated
key.
shell> curl -X POST --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products <<EOF
{ "Hello": "World" }
EOF
HTTP/1.1 201 Created
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 60
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-tW---"
expires: 0
location: /_db/_system/_api/document/products/69487
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Create a document in a collection named products
with a collection-level
waitForSync
value of false
.
shell> curl -X POST --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products <<EOF
{ "Hello": "World" }
EOF
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 60
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-se--_"
expires: 0
location: /_db/_system/_api/document/products/69463
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Create a document in a collection with a collection-level waitForSync
value of false
, but using the waitForSync
query parameter.
shell> curl -X POST --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products?waitForSync=true <<EOF
{ "Hello": "World" }
EOF
HTTP/1.1 201 Created
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 60
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-vi--_"
expires: 0
location: /_db/_system/_api/document/products/69538
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Unknown collection name
shell> curl -X POST --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products <<EOF
{ "Hello": "World" }
EOF
HTTP/1.1 404 Not Found
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 97
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Illegal document
shell> curl -X POST --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products <<EOF
{ 1: "World" }
EOF
HTTP/1.1 400 Bad Request
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 97
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Use of returnNew:
shell> curl -X POST --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products?returnNew=true <<EOF
{"Hello":"World"}
EOF
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 143
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-vG--_"
expires: 0
location: /_db/_system/_api/document/products/69527
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
shell> curl -X POST --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products <<EOF
{ "Hello": "World", "_key" : "lock" }
EOF
HTTP/1.1 201 Created
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 58
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-uW--_"
expires: 0
location: /_db/_system/_api/document/products/lock
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
shell> curl -X POST --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products?overwrite=true <<EOF
{ "Hello": "Universe", "_key" : "lock" }
EOF
HTTP/1.1 201 Created
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 82
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-uq---"
expires: 0
location: /_db/_system/_api/document/products/lock
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Replace document
replaces a document
PUT /_api/document/{collection}/{key}
Path Parameters
-
collection (string, required): Name of the
collection
in which the document is to be replaced. -
key (string, required): The document key.
Query Parameters
-
waitForSync (boolean, optional): Wait until document has been synced to disk.
-
ignoreRevs (boolean, optional): By default, or if this is set to
true
, the_rev
attributes in the given document is ignored. If this is set tofalse
, then the_rev
attribute given in the body document is taken as a precondition. The document is only replaced if the current revision is the one specified. -
returnOld (boolean, optional): Return additionally the complete previous revision of the changed document under the attribute
old
in the result. -
returnNew (boolean, optional): Return additionally the complete new document under the attribute
new
in the result. -
silent (boolean, optional): If set to
true
, an empty object is returned as response if the document operation succeeds. No meta-data is returned for the replaced document. If the operation raises an error, an error object is returned.You can use this option to save network traffic.
-
refillIndexCaches (boolean, optional): Whether to update an existing entry in the in-memory edge cache if an edge document is replaced.
Header Parameters
- If-Match (string, optional):
You can conditionally replace a document based on a target revision id by
using the
if-match
HTTP header.
Request Body
(object, required)
A JSON representation of a single document.
Replaces the specified document with the one in the body, provided there is such a document and no precondition is violated.
The value of the _key
attribute as well as attributes
used as sharding keys may not be changed.
If the If-Match
header is specified and the revision of the
document in the database is unequal to the given revision, the
precondition is violated.
If If-Match
is not given and ignoreRevs
is false
and there
is a _rev
attribute in the body and its value does not match
the revision of the document in the database, the precondition is
violated.
If a precondition is violated, an HTTP 412 is returned.
If the document exists and can be updated, then an HTTP 201 or
an HTTP 202 is returned (depending on waitForSync
, see below),
the Etag
header field contains the new revision of the document
and the Location
header contains a complete URL under which the
document can be queried.
Cluster only: The replace documents may contain values for the collection’s pre-defined shard keys. Values for the shard keys are treated as hints to improve performance. Should the shard keys values be incorrect ArangoDB may answer with a not found error.
Optionally, the query parameter waitForSync
can be used to force
synchronization of the document replacement operation to disk even in case
that the waitForSync
flag had been disabled for the entire collection.
Thus, the waitForSync
query parameter can be used to force synchronization
of just specific operations. To use this, set the waitForSync
parameter
to true
. If the waitForSync
parameter is not specified or set to
false
, then the collection’s default waitForSync
behavior is
applied. The waitForSync
query parameter cannot be used to disable
synchronization for collections that have a default waitForSync
value
of true
.
If silent
is not set to true
, the body of the response contains a JSON
object with the information about the identifier and the revision. The attribute
_id
contains the known document ID of the updated document, _key
contains the key which uniquely identifies a document in a given collection,
and the attribute _rev
contains the new document revision.
If the query parameter returnOld
is true
, then
the complete previous revision of the document
is returned under the old
attribute in the result.
If the query parameter returnNew
is true
, then
the complete new document is returned under
the new
attribute in the result.
If the document does not exist, then a HTTP 404 is returned and the body of the response contains an error document.
Responses
HTTP 201: is returned if the document was replaced successfully and
waitForSync
was true
.
HTTP 202: is returned if the document was replaced successfully and
waitForSync
was false
.
HTTP 400: is returned if the body does not contain a valid JSON representation of a document. The response body contains an error document in this case.
HTTP 404: is returned if the collection or the document was not found.
HTTP 409: is returned if the replace causes a unique constraint violation in a secondary index.
HTTP 412: is returned if the precondition is violated. The response also contains
the found documents’ current revisions in the _rev
attributes.
Additionally, the attributes _id
and _key
are returned.
Examples
Using a document identifier
shell> curl -X PUT --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products/69589 <<EOF
{"Hello": "you"}
EOF
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 84
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-xO---"
expires: 0
location: /_db/_system/_api/document/products/69589
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Unknown document identifier
shell> curl -X PUT --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products/69612 <<EOF
{}
EOF
HTTP/1.1 404 Not Found
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 77
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Produce a revision conflict
shell> curl -X PUT --header 'If-Match: "_fyvN-xi---"' --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products/69599 <<EOF
{"other":"content"}
EOF
HTTP/1.1 412 Precondition Failed
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 152
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-xe--_"
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Update document
updates a document
PATCH /_api/document/{collection}/{key}
Path Parameters
-
collection (string, required): Name of the
collection
in which the document is to be updated. -
key (string, required): The document key.
Query Parameters
-
keepNull (boolean, optional): If the intention is to delete existing attributes with the patch command, the URL query parameter
keepNull
can be used with a value offalse
. This modifies the behavior of the patch command to remove any attributes from the existing document that are contained in the patch document with an attribute value ofnull
. -
mergeObjects (boolean, optional): Controls whether objects (not arrays) are merged if present in both the existing and the patch document. If set to
false
, the value in the patch document overwrites the existing document’s value. If set totrue
, objects are merged. The default istrue
. -
waitForSync (boolean, optional): Wait until document has been synced to disk.
-
ignoreRevs (boolean, optional): By default, or if this is set to
true
, the_rev
attributes in the given document is ignored. If this is set tofalse
, then the_rev
attribute given in the body document is taken as a precondition. The document is only updated if the current revision is the one specified. -
returnOld (boolean, optional): Return additionally the complete previous revision of the changed document under the attribute
old
in the result. -
returnNew (boolean, optional): Return additionally the complete new document under the attribute
new
in the result. -
silent (boolean, optional): If set to
true
, an empty object is returned as response if the document operation succeeds. No meta-data is returned for the updated document. If the operation raises an error, an error object is returned.You can use this option to save network traffic.
-
refillIndexCaches (boolean, optional): Whether to update an existing entry in the in-memory edge cache if an edge document is updated.
Header Parameters
- If-Match (string, optional):
You can conditionally update a document based on a target revision id by
using the
if-match
HTTP header.
Request Body
(object, required)
A JSON representation of a document update as an object.
Partially updates the document identified by the document ID. The body of the request must contain a JSON document with the attributes to patch (the patch document). All attributes from the patch document are added to the existing document if they do not yet exist, and overwritten in the existing document if they do exist there.
The value of the _key
attribute as well as attributes
used as sharding keys may not be changed.
Setting an attribute value to null
in the patch document causes a
value of null
to be saved for the attribute by default.
If the If-Match
header is specified and the revision of the
document in the database is unequal to the given revision, the
precondition is violated.
If If-Match
is not given and ignoreRevs
is false
and there
is a _rev
attribute in the body and its value does not match
the revision of the document in the database, the precondition is
violated.
If a precondition is violated, an HTTP 412 is returned.
If the document exists and can be updated, then an HTTP 201 or
an HTTP 202 is returned (depending on waitForSync
, see below),
the Etag
header field contains the new revision of the document
(in double quotes) and the Location
header contains a complete URL
under which the document can be queried.
Cluster only: The patch document may contain
values for the collection’s pre-defined shard keys. Values for the shard keys
are treated as hints to improve performance. Should the shard keys
values be incorrect ArangoDB may answer with a not found
error
Optionally, the query parameter waitForSync
can be used to force
synchronization of the updated document operation to disk even in case
that the waitForSync
flag had been disabled for the entire collection.
Thus, the waitForSync
query parameter can be used to force synchronization
of just specific operations. To use this, set the waitForSync
parameter
to true
. If the waitForSync
parameter is not specified or set to
false
, then the collection’s default waitForSync
behavior is
applied. The waitForSync
query parameter cannot be used to disable
synchronization for collections that have a default waitForSync
value
of true
.
If silent
is not set to true
, the body of the response contains a JSON
object with the information about the identifier and the revision. The attribute
_id
contains the known document ID of the updated document, _key
contains the key which uniquely identifies a document in a given collection,
and the attribute _rev
contains the new document revision.
If the query parameter returnOld
is true
, then
the complete previous revision of the document
is returned under the old
attribute in the result.
If the query parameter returnNew
is true
, then
the complete new document is returned under
the new
attribute in the result.
If the document does not exist, then a HTTP 404 is returned and the body of the response contains an error document.
Responses
HTTP 201: is returned if the document was updated successfully and
waitForSync
was true
.
HTTP 202: is returned if the document was updated successfully and
waitForSync
was false
.
HTTP 400: is returned if the body does not contain a valid JSON representation of a document. The response body contains an error document in this case.
HTTP 404: is returned if the collection or the document was not found.
HTTP 409: is returned if the update causes a unique constraint violation in a secondary index.
HTTP 412: is returned if the precondition was violated. The response also contains
the found documents’ current revisions in the _rev
attributes.
Additionally, the attributes _id
and _key
are returned.
Examples
Patches an existing document with new content.
shell> curl -X PATCH --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products/69435 <<EOF
{
"hello" : "world"
}
EOF
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 84
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-qu---"
expires: 0
location: /_db/_system/_api/document/products/69435
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
shell> curl -X PATCH --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products/69435 <<EOF
{
"numbers" : {
"one" : 1,
"two" : 2,
"three" : 3,
"empty" : null
}
}
EOF
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 84
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-q2---"
expires: 0
location: /_db/_system/_api/document/products/69435
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
shell> curl --header 'accept: application/json' --dump - http://localhost:8529/_api/document/products/69435
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 141
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-q2---"
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
shell> curl -X PATCH --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products/69435?keepNull=false <<EOF
{
"hello" : null,
"numbers" : {
"four" : 4
}
}
EOF
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 84
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-rK---"
expires: 0
location: /_db/_system/_api/document/products/69435
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
shell> curl --header 'accept: application/json' --dump - http://localhost:8529/_api/document/products/69435
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 134
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-rK---"
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Merging attributes of an object using mergeObjects
:
shell> curl --header 'accept: application/json' --dump - http://localhost:8529/_api/document/products/69449
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 130
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-rq---"
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
shell> curl -X PATCH --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products/69449?mergeObjects=true <<EOF
{
"inhabitants" : {
"indonesia" : 252164800,
"brazil" : 203553000
}
}
EOF
shell> curl --header 'accept: application/json' --dump - http://localhost:8529/_api/document/products/69449
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 171
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-ry---"
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
shell> curl -X PATCH --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products/69449?mergeObjects=false <<EOF
{
"inhabitants" : {
"pakistan" : 188346000
}
}
EOF
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 84
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-s----"
expires: 0
location: /_db/_system/_api/document/products/69449
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
shell> curl --header 'accept: application/json' --dump - http://localhost:8529/_api/document/products/69449
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 97
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-s----"
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Removes a document
removes a document
DELETE /_api/document/{collection}/{key}
Path Parameters
-
collection (string, required): Name of the
collection
in which the document is to be deleted. -
key (string, required): The document key.
Query Parameters
-
waitForSync (boolean, optional): Wait until deletion operation has been synced to disk.
-
returnOld (boolean, optional): Return additionally the complete previous revision of the changed document under the attribute
old
in the result. -
silent (boolean, optional): If set to
true
, an empty object is returned as response if the document operation succeeds. No meta-data is returned for the deleted document. If the operation raises an error, an error object is returned.You can use this option to save network traffic.
-
refillIndexCaches (boolean, optional): Whether to delete an existing entry from the in-memory edge cache and refill it with another edge if an edge document is removed.
Header Parameters
- If-Match (string, optional):
You can conditionally remove a document based on a target revision id by
using the
if-match
HTTP header.
If silent
is not set to true
, the body of the response contains a JSON
object with the information about the identifier and the revision. The attribute
_id
contains the known document ID of the removed document, _key
contains the key which uniquely identifies a document in a given collection,
and the attribute _rev
contains the document revision.
If the waitForSync
parameter is not specified or set to false
,
then the collection’s default waitForSync
behavior is applied.
The waitForSync
query parameter cannot be used to disable
synchronization for collections that have a default waitForSync
value of true
.
If the query parameter returnOld
is true
, then
the complete previous revision of the document
is returned under the old
attribute in the result.
Responses
HTTP 200: is returned if the document was removed successfully and
waitForSync
was true
.
HTTP 202: is returned if the document was removed successfully and
waitForSync
was false
.
HTTP 404: is returned if the collection or the document was not found. The response body contains an error document in this case.
HTTP 412: is returned if a “If-Match” header or rev
is given and the found
document has a different version. The response also contain the found
document’s current revision in the _rev
attribute. Additionally, the
attributes _id
and _key
are returned.
Examples
Using document identifier:
shell> curl -X DELETE --header 'accept: application/json' --dump - http://localhost:8529/_api/document/products/69339
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 60
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-lW---"
expires: 0
location: /_db/_system/_api/document/products/69339
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Unknown document identifier:
shell> curl -X DELETE --header 'accept: application/json' --dump - http://localhost:8529/_api/document/products/69407
HTTP/1.1 404 Not Found
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 77
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Revision conflict:
shell> curl -X DELETE --header 'If-Match: "_fyvN-m2---"' --header 'accept: application/json' --dump - http://localhost:8529/_api/document/products/69358
HTTP/1.1 412 Precondition Failed
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 152
content-security-policy: frame-ancestors 'self'; form-action 'self';
etag: "_fyvN-my--_"
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Document ETags
ArangoDB tries to adhere to the existing HTTP standard as far as
possible. To this end, results of single document queries have the ETag
HTTP header set to the document revision
(the value of _rev
document attribute) enclosed in double quotes.
You can check the revision of a document using the HEAD
HTTP method.
If you want to query, replace, update, replace, or delete a document, then you
can use the If-Match
header to detect conflicts. If the document has changed,
the operation is aborted and an HTTP 412 Precondition failed
status code is
returned.
If you obtain a document using GET
and you want to check whether a newer
revision is available, then you can use the If-None-Match
HTTP header. If the
document is unchanged (same document revision), an HTTP 412 Precondition failed
status code is returned.
Multiple document operations
ArangoDB supports working with documents in bulk. Bulk operations affect a single collection. Using this API variant allows clients to amortize the overhead of single requests over an entire batch of documents. Bulk operations are not guaranteed to be executed serially, ArangoDB may execute the operations in parallel. This can translate into large performance improvements especially in a cluster deployment.
ArangoDB continues to process the remaining operations should an error
occur during the processing of one operation. Errors are returned inline in
the response body as an error document (see below for more details).
Additionally, the X-Arango-Error-Codes
header contains a map of the
error codes that occurred together with their multiplicities, like
1205:10,1210:17
which means that in 10 cases the error 1205
(illegal document handle) and in 17 cases the error 1210
(unique constraint violated) has happened.
Generally, the bulk operations expect an input array and the result body contains a JSON array of the same length.
Read multiple documents
reads a single document
PUT /_api/document/{collection}
Path Parameters
- collection (string, required): Name of the collection from which the documents are to be read.
Query Parameters
-
onlyget (boolean, required): This parameter is required to be true, otherwise a replace operation is executed!
-
ignoreRevs (string, optional): Should the value be true (the default): If a search document contains a value for the _rev field, then the document is only returned if it has the same revision value. Otherwise a precondition failed error is returned.
Header Parameters
-
x-arango-allow-dirty-read (boolean, optional): Set this header to
true
to allow the Coordinator to ask any shard replica for the data, not only the shard leader. This may result in “dirty reads”.The header is ignored if this operation is part of a Stream Transaction (
x-arango-trx-id
header). The header set when creating the transaction decides about dirty reads for the entire transaction, not the individual read operations. -
x-arango-trx-id (string, optional): To make this operation a part of a Stream Transaction, set this header to the transaction ID returned by the
POST /_api/transaction/begin
call.
Request Body
(json, required)
An array of documents to retrieve.
Returns the documents identified by their _key in the body objects. The body of the request must contain a JSON array of either strings (the _key values to lookup) or search documents.
A search document must contain at least a value for the _key field.
A value for _rev
may be specified to verify whether the document
has the same revision value, unless ignoreRevs is set to false.
Cluster only: The search document may contain values for the collection’s pre-defined shard keys. Values for the shard keys are treated as hints to improve performance. Should the shard keys values be incorrect ArangoDB may answer with a not found error.
The returned array of documents contain three special attributes: _id containing the document identifier, _key containing key which uniquely identifies a document in a given collection and _rev containing the revision.
Responses
HTTP 200: is returned if no error happened
HTTP 400: is returned if the body does not contain a valid JSON representation of an array of documents. The response body contains an error document in this case.
HTTP 404: is returned if the collection was not found.
Examples
Reading multiple documents identifier:
shell> curl -X PUT --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products?onlyget=true <<EOF
["doc1", {"_key":"doc2"}]
EOF
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 153
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Create multiple documents
creates multiple documents
POST /_api/document/{collection}
Path Parameters
- collection (string, required):
Name of the
collection
in which the documents are to be created.
Query Parameters
-
collection (string, optional): The name of the collection. This is only for backward compatibility. In ArangoDB versions < 3.0, the URL path was
/_api/document
and this query parameter was required. This combination still works, but the recommended way is to specify the collection in the URL path. -
waitForSync (boolean, optional): Wait until document has been synced to disk.
-
returnNew (boolean, optional): Additionally return the complete new document under the attribute
new
in the result. -
returnOld (boolean, optional): Additionally return the complete old document under the attribute
old
in the result. Only available if the overwrite option is used. -
silent (boolean, optional): If set to
true
, an empty object is returned as response if all document operations succeed. No meta-data is returned for the created documents. If any of the operations raises an error, an array with the error object(s) is returned.You can use this option to save network traffic but you cannot map any errors to the inputs of your request.
-
overwrite (boolean, optional): If set to
true
, the insert becomes a replace-insert. If a document with the same_key
already exists, the new document is not rejected with a unique constraint violation error but replaces the old document. Note that operations withoverwrite
parameter require a_key
attribute in the request payload, therefore they can only be performed on collections sharded by_key
. - overwriteMode (string, optional):
This option supersedes
overwrite
and offers the following modes:"ignore"
: if a document with the specified_key
value exists already, nothing is done and no write operation is carried out. The insert operation returns success in this case. This mode does not support returning the old document version usingRETURN OLD
. When usingRETURN NEW
,null
is returned in case the document already existed."replace"
: if a document with the specified_key
value exists already, it is overwritten with the specified document value. This mode is also used when no overwrite mode is specified but theoverwrite
flag is set totrue
."update"
: if a document with the specified_key
value exists already, it is patched (partially updated) with the specified document value. The overwrite mode can be further controlled via thekeepNull
andmergeObjects
parameters."conflict"
: if a document with the specified_key
value exists already, return a unique constraint violation error so that the insert operation fails. This is also the default behavior in case the overwrite mode is not set, and theoverwrite
flag isfalse
or not set either.
-
keepNull (boolean, optional): If the intention is to delete existing attributes with the update-insert command, the URL query parameter
keepNull
can be used with a value offalse
. This modifies the behavior of the patch command to remove any attributes from the existing document that are contained in the patch document with an attribute value ofnull
. This option controls the update-insert behavior only. -
mergeObjects (boolean, optional): Controls whether objects (not arrays) are merged if present in both, the existing and the update-insert document. If set to
false
, the value in the patch document overwrites the existing document’s value. If set totrue
, objects are merged. The default istrue
. This option controls the update-insert behavior only. - refillIndexCaches (boolean, optional): Whether to add new entries to the in-memory edge cache if edge documents are inserted.
Request Body
(json, required)
An array of documents to create.
Creates new documents from the documents given in the body, unless there
is already a document with the _key
given. If no _key
is given, a new
unique _key
is generated automatically.
The result body contains a JSON array of the
same length as the input array, and each entry contains the result
of the operation for the corresponding input. In case of an error
the entry is a document with attributes error
set to true
and
errorCode set to the error code that has happened.
Possibly given _id
and _rev
attributes in the body are always ignored,
the URL part or the query parameter collection respectively counts.
If silent
is not set to true
, the body of the response contains an
array of JSON objects with the following attributes:
_id
contains the document identifier of the newly created document_key
contains the document key_rev
contains the document revision
If the collection parameter waitForSync
is false
, then the call
returns as soon as the documents have been accepted. It does not wait
until the documents have been synced to disk.
Optionally, the query parameter waitForSync
can be used to force
synchronization of the document creation operation to disk even in
case that the waitForSync
flag had been disabled for the entire
collection. Thus, the waitForSync
query parameter can be used to
force synchronization of just this specific operations. To use this,
set the waitForSync
parameter to true
. If the waitForSync
parameter is not specified or set to false
, then the collection’s
default waitForSync
behavior is applied. The waitForSync
query
parameter cannot be used to disable synchronization for collections
that have a default waitForSync
value of true
.
If the query parameter returnNew
is true
, then, for each
generated document, the complete new document is returned under
the new
attribute in the result.
Should an error have occurred with some of the documents
the additional HTTP header X-Arango-Error-Codes
is set, which
contains a map of the error codes that occurred together with their
multiplicities, as in: 1205:10,1210:17
which means that in 10
cases the error 1205 “illegal document handle” and in 17 cases the
error 1210 “unique constraint violated” has happened.
Responses
HTTP 201: is returned if waitForSync
was true
and operations were processed.
HTTP 202: is returned if waitForSync
was false
and operations were processed.
HTTP 400: is returned if the body does not contain a valid JSON representation of an array of documents. The response body contains an error document in this case.
HTTP 404: is returned if the collection specified by collection
is unknown.
The response body contains an error document in this case.
Examples
Insert multiple documents:
shell> curl -X POST --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products <<EOF
[{"Hello":"Earth"}, {"Hello":"Venus"}, {"Hello":"Mars"}]
EOF
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 184
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Use of returnNew:
shell> curl -X POST --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products?returnNew=true <<EOF
[{"Hello":"Earth"}, {"Hello":"Venus"}, {"Hello":"Mars"}]
EOF
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 432
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Partially illegal documents:
shell> curl -X POST --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products <<EOF
[{ "_key": 111 }, {"_key":"abc"}]
EOF
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 127
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-error-codes: {"1221":1}
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Replace documents
replaces multiple documents
PUT /_api/document/{collection}
Path Parameters
- collection (string, required): This URL parameter is the name of the collection in which the documents are replaced.
Query Parameters
-
waitForSync (boolean, optional): Wait until the new documents have been synced to disk.
-
ignoreRevs (boolean, optional): By default, or if this is set to
true
, the_rev
attributes in the given documents are ignored. If this is set tofalse
, then any_rev
attribute given in a body document is taken as a precondition. The document is only replaced if the current revision is the one specified. -
returnOld (boolean, optional): Return additionally the complete previous revision of the changed documents under the attribute
old
in the result. -
returnNew (boolean, optional): Return additionally the complete new documents under the attribute
new
in the result. -
silent (boolean, optional): If set to
true
, an empty object is returned as response if all document operations succeed. No meta-data is returned for the replaced documents. If at least one operation raises an error, an array with the error object(s) is returned.You can use this option to save network traffic but you cannot map any errors to the inputs of your request.
-
refillIndexCaches (boolean, optional): Whether to update existing entries in the in-memory edge cache if edge documents are replaced.
Request Body
(json, required)
A JSON representation of an array of documents.
Replaces multiple documents in the specified collection with the
ones in the body, the replaced documents are specified by the _key
attributes in the body documents.
The value of the _key
attribute as well as attributes
used as sharding keys may not be changed.
If ignoreRevs
is false
and there is a _rev
attribute in a
document in the body and its value does not match the revision of
the corresponding document in the database, the precondition is
violated.
Cluster only: The replace documents may contain
values for the collection’s pre-defined shard keys. Values for the shard keys
are treated as hints to improve performance. Should the shard keys
values be incorrect ArangoDB may answer with a not found
error.
Optionally, the query parameter waitForSync
can be used to force
synchronization of the document replacement operation to disk even in case
that the waitForSync
flag had been disabled for the entire collection.
Thus, the waitForSync
query parameter can be used to force synchronization
of just specific operations. To use this, set the waitForSync
parameter
to true
. If the waitForSync
parameter is not specified or set to
false
, then the collection’s default waitForSync
behavior is
applied. The waitForSync
query parameter cannot be used to disable
synchronization for collections that have a default waitForSync
value
of true
.
The body of the response contains a JSON array of the same length
as the input array with the information about the identifier and the
revision of the replaced documents. In each entry, the attribute
_id
contains the known document-id
of each updated document,
_key
contains the key which uniquely identifies a document in a
given collection, and the attribute _rev
contains the new document
revision. In case of an error or violated precondition, an error
object with the attribute error
set to true
and the attribute
errorCode
set to the error code is built.
If the query parameter returnOld
is true
, then, for each
generated document, the complete previous revision of the document
is returned under the old
attribute in the result.
If the query parameter returnNew
is true
, then, for each
generated document, the complete new document is returned under
the new
attribute in the result.
Note that if any precondition is violated or an error occurred with
some of the documents, the return code is still 201 or 202, but
the additional HTTP header X-Arango-Error-Codes
is set, which
contains a map of the error codes that occurred together with their
multiplicities, as in: 1200:17,1205:10
which means that in 17
cases the error 1200 “revision conflict” and in 10 cases the error
1205 “illegal document handle” has happened.
Responses
HTTP 201: is returned if waitForSync
was true
and operations were processed.
HTTP 202: is returned if waitForSync
was false
and operations were processed.
HTTP 400: is returned if the body does not contain a valid JSON representation of an array of documents. The response body contains an error document in this case.
HTTP 404: is returned if the collection was not found.
Update documents
updates multiple documents
PATCH /_api/document/{collection}
Path Parameters
- collection (string, required):
Name of the
collection
in which the documents are to be updated.
Query Parameters
-
keepNull (boolean, optional): If the intention is to delete existing attributes with the patch command, the URL query parameter
keepNull
can be used with a value offalse
. This modifies the behavior of the patch command to remove any attributes from the existing document that are contained in the patch document with an attribute value ofnull
. -
mergeObjects (boolean, optional): Controls whether objects (not arrays) are merged if present in both the existing and the patch document. If set to
false
, the value in the patch document overwrites the existing document’s value. If set totrue
, objects are merged. The default istrue
. -
waitForSync (boolean, optional): Wait until the new documents have been synced to disk.
-
ignoreRevs (boolean, optional): By default, or if this is set to
true
, the_rev
attributes in the given documents are ignored. If this is set tofalse
, then any_rev
attribute given in a body document is taken as a precondition. The document is only updated if the current revision is the one specified. -
returnOld (boolean, optional): Return additionally the complete previous revision of the changed documents under the attribute
old
in the result. -
returnNew (boolean, optional): Return additionally the complete new documents under the attribute
new
in the result. -
silent (boolean, optional): If set to
true
, an empty object is returned as response if all document operations succeed. No meta-data is returned for the updated documents. If at least one operation raises an error, an array with the error object(s) is returned.You can use this option to save network traffic but you cannot map any errors to the inputs of your request.
-
refillIndexCaches (boolean, optional): Whether to update existing entries in the in-memory edge cache if edge documents are updated.
Request Body
(json, required)
A JSON representation of an array of document updates as objects.
Partially updates documents, the documents to update are specified
by the _key
attributes in the body objects. The body of the
request must contain a JSON array of document updates with the
attributes to patch (the patch documents). All attributes from the
patch documents are added to the existing documents if they do
not yet exist, and overwritten in the existing documents if they do
exist there.
The value of the _key
attribute as well as attributes
used as sharding keys may not be changed.
Setting an attribute value to null
in the patch documents causes a
value of null
to be saved for the attribute by default.
If ignoreRevs
is false
and there is a _rev
attribute in a
document in the body and its value does not match the revision of
the corresponding document in the database, the precondition is
violated.
Cluster only: The patch document may contain values for the collection’s pre-defined shard keys. Values for the shard keys are treated as hints to improve performance. Should the shard keys values be incorrect ArangoDB may answer with a not found error
Optionally, the query parameter waitForSync
can be used to force
synchronization of the document replacement operation to disk even in case
that the waitForSync
flag had been disabled for the entire collection.
Thus, the waitForSync
query parameter can be used to force synchronization
of just specific operations. To use this, set the waitForSync
parameter
to true
. If the waitForSync
parameter is not specified or set to
false
, then the collection’s default waitForSync
behavior is
applied. The waitForSync
query parameter cannot be used to disable
synchronization for collections that have a default waitForSync
value
of true
.
The body of the response contains a JSON array of the same length
as the input array with the information about the identifier and the
revision of the updated documents. In each entry, the attribute
_id
contains the known document ID of each updated document,
_key
contains the key which uniquely identifies a document in a
given collection, and the attribute _rev
contains the new document
revision. In case of an error or violated precondition, an error
object with the attribute error
set to true
and the attribute
errorCode
set to the error code is built.
If the query parameter returnOld
is true
, then, for each
generated document, the complete previous revision of the document
is returned under the old
attribute in the result.
If the query parameter returnNew
is true
, then, for each
generated document, the complete new document is returned under
the new
attribute in the result.
Note that if any precondition is violated or an error occurred with
some of the documents, the return code is still 201 or 202, but
the additional HTTP header X-Arango-Error-Codes
is set, which
contains a map of the error codes that occurred together with their
multiplicities, as in: 1200:17,1205:10
which means that in 17
cases the error 1200 “revision conflict” and in 10 cases the error
1205 “illegal document handle” has happened.
Responses
HTTP 201: is returned if waitForSync
was true
and operations were processed.
HTTP 202: is returned if waitForSync
was false
and operations were processed.
HTTP 400: is returned if the body does not contain a valid JSON representation of an array of documents. The response body contains an error document in this case.
HTTP 404: is returned if the collection was not found.
Removes multiple documents
removes multiple document
DELETE /_api/document/{collection}
Path Parameters
- collection (string, required): Collection from which documents are removed.
Query Parameters
-
waitForSync (boolean, optional): Wait until deletion operation has been synced to disk.
-
returnOld (boolean, optional): Return additionally the complete previous revision of the changed document under the attribute
old
in the result. -
silent (boolean, optional): If set to
true
, an empty object is returned as response if all document operations succeed. No meta-data is returned for the deleted documents. If at least one of the operations raises an error, an array with the error object(s) is returned.You can use this option to save network traffic but you cannot map any errors to the inputs of your request.
-
ignoreRevs (boolean, optional): If set to
true
, ignore any_rev
attribute in the selectors. No revision check is performed. If set tofalse
then revisions are checked. The default istrue
. -
refillIndexCaches (boolean, optional): Whether to delete existing entries from the in-memory edge cache and refill it with other edges if edge documents are removed.
Request Body
(json, required)
A JSON array of strings or documents.
The body of the request is an array consisting of selectors for
documents. A selector can either be a string with a key or a string
with a document identifier or an object with a _key
attribute. This
API call removes all specified documents from collection
.
If the ignoreRevs
query parameter is false
and the
selector is an object and has a _rev
attribute, it is a
precondition that the actual revision of the removed document in the
collection is the specified one.
The body of the response is an array of the same length as the input
array. For each input selector, the output contains a JSON object
with the information about the outcome of the operation. If no error
occurred, an object is built in which the attribute _id
contains
the known document ID of the removed document, _key
contains
the key which uniquely identifies a document in a given collection,
and the attribute _rev
contains the document revision. In case of
an error, an object with the attribute error
set to true
and
errorCode
set to the error code is built.
If the waitForSync
parameter is not specified or set to false
,
then the collection’s default waitForSync
behavior is applied.
The waitForSync
query parameter cannot be used to disable
synchronization for collections that have a default waitForSync
value of true
.
If the query parameter returnOld
is true
, then
the complete previous revision of the document
is returned under the old
attribute in the result.
Note that if any precondition is violated or an error occurred with
some of the documents, the return code is still 200 or 202, but
the additional HTTP header X-Arango-Error-Codes
is set, which
contains a map of the error codes that occurred together with their
multiplicities, as in: 1200:17,1205:10
which means that in 17
cases the error 1200 “revision conflict” and in 10 cases the error
1205 “illegal document handle” has happened.
Responses
HTTP 200: is returned if waitForSync
was true
.
HTTP 202: is returned if waitForSync
was false
.
HTTP 404: is returned if the collection was not found. The response body contains an error document in this case.
Examples
Using document keys:
shell> curl -X DELETE --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products <<EOF
[
"1",
"2"
]
EOF
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 107
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Using document identifiers:
shell> curl -X DELETE --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products <<EOF
[
"products/1",
"products/2"
]
EOF
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 107
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Using objects with document keys:
shell> curl -X DELETE --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products <<EOF
[
{
"_key" : "1"
},
{
"_key" : "2"
}
]
EOF
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 107
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Unknown documents:
shell> curl -X DELETE --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products <<EOF
[
"1",
"other/2"
]
EOF
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 135
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-error-codes: {"1202":2}
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Check revisions:
shell> curl -X DELETE --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products?ignoreRevs=false <<EOF
[
{
"_key" : "1",
"_rev" : "_fyvN-oy---"
},
{
"_key" : "2",
"_rev" : "_fyvN-oy--_"
}
]
EOF
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 107
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Revision conflict:
shell> curl -X DELETE --header 'accept: application/json' --data-binary @- --dump - http://localhost:8529/_api/document/products?ignoreRevs=false <<EOF
[
{
"_key" : "1",
"_rev" : "non-matching revision"
},
{
"_key" : "2",
"_rev" : "non-matching revision"
}
]
EOF
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 167
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-error-codes: {"1200":2}
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
Read from followers
Introduced in: v3.10.0
Reading from followers in cluster deployments is only available in the Enterprise Edition, including the ArangoGraph Insights Platform.
In an ArangoDB cluster, all reads and writes are performed via the shard leaders. Shard replicas replicate all operations, but are only on hot standby to take over in case of a failure. This is to ensure consistency of reads and writes and allows giving a certain amount of transactional guarantees.
If high throughput is more important than consistency and transactional guarantees for you, then you may allow for so-called “dirty reads” or “reading from followers”, for certain read-only operations. In this case, Coordinators are allowed to read not only from leader shards but also from follower shards. This has a positive effect, because the reads can scale out to all DB-Servers which have copies of the data. Therefore, the read throughput is higher. Note however, that you still have to go through your Coordinators. To get the desired result, you have to have enough Coordinators, load balance your client requests across all of them, and then allow reads from followers.
You may observe the following data inconsistencies (dirty reads) when reading from followers:
-
It is possible to see old, obsolete revisions of documents. More exactly, it is possible that documents are already updated on the leader shard but the updates have not yet been replicated to the follower shard from which you are reading.
-
It is also possible to see changes to documents that have already happened on a replica, but are not yet officially committed on the leader shard.
When no writes are happening, allowing reading from followers is generally safe.
The following APIs support reading from followers:
- Single document reads (
GET /_api/document
) - Batch document reads (
PUT /_api/document?onlyget=true
) - Read-only AQL queries (
POST /_api/cursor
) - The edge API (
GET /_api/edges
) - Read-only Stream Transactions and their sub-operations
(
POST /_api/transaction/begin
etc.)
The following APIs do not support reading from followers:
- The graph API (
GET /_api/gharial
etc.) - JavaScript Transactions (
POST /_api/transaction
)
You need to set the following HTTP header in API requests to ask for reads from followers:
x-arango-allow-dirty-read: true
This is in line with the older support to read from followers in the Active Failover deployment mode.
For single requests, you specify this header in the read request. For Stream Transactions, the header has to be set on the request that creates a read-only transaction.
The POST /_api/cursor
endpoint also supports a query option that you can set
instead of the HTTP header:
{ "query": "...", "options": { "allowDirtyReads": true } }
Every response to a request that could produce dirty reads has the following HTTP header:
x-arango-potential-dirty-read: true