Skip to main content


A document is a single object which is stored in a collection. It can be compared to a single record in a relational database table. You get an RxDocument either as return on inserts, or as result-set of queries.


To insert a document into a collection, you have to call the collection's .insert()-function.

name: 'foo',
lastname: 'bar'


To find documents in a collection, you have to call the collection's .find()-function. See RxQuery.

myCollection.find().exec() // <- find all documents
.then(documents => console.dir(documents));



This will get a single field of the document. If the field is encrypted, it will be automatically decrypted before returning.

var name = myDocument.get('name'); // returns the name


This function returns an observable of the given paths-value. The current value of this path will be emitted each time the document changes.

// get the live-updating value of 'name'
var isName;
.subscribe(newName => {
isName = newName;

await myDocument.incrementalPatch({name: 'foobar2'});
console.dir(isName); // isName is now 'foobar2'


All properties of a RxDocument are assigned as getters so you can also directly access values instead of using the get()-function.

  // Identical to myDocument.get('name');
var name =;
// Can also get nested values.
var nestedValue = myDocument.whatever.nestedfield;

// Also usable with observables:
myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName));
// > 'name is: Stefe'
await myDocument.incrementalPatch({firstName: 'Steve'});
// > 'name is: Steve'


Updates the document based on the mongo-update-syntax, based on the mingo library.

* If not done before, you have to add the update plugin.
import { addRxPlugin } from 'rxdb';
import { RxDBUpdatePlugin } from 'rxdb/plugins/update';

await myDocument.update({
$inc: {
age: 1 // increases age by 1
$set: {
firstName: 'foobar' // sets firstName to foobar


Updates a documents data based on a function that mutates the current data and returns the new value.

const changeFunction = (oldData) => {
oldData.age = oldData.age + 1; = 'foooobarNew';
return oldData;
await myDocument.modify(changeFunction);
console.log(; // 'foooobarNew'


Overwrites the given attributes over the documents data.

await myDocument.patch({
name: 'Steve',
age: undefined // setting an attribute to undefined will remove it
console.log(; // 'Steve'

Prevent conflicts with the incremental methods

Making a normal change to the non-latest version of a RxDocument will lead to a 409 CONFLICT error because RxDB uses revision checks instead of transactions.

To make a change to a document, no matter what the current state is, you can use the incremental methods:

// update
await myDocument.incrementalUpdate({
$inc: {
age: 1 // increases age by 1

// modify
await myDocument.incrementalModify(docData => {
docData.age = docData.age + 1;
return docData;

// patch
await myDocument.incrementalPatch({
age: 100

// remove
await myDocument.incrementalRemove({
age: 100


Returns the latest known state of the RxDocument.

const myDocument = await myCollection.findOne('foobar').exec();
const docAfterEdit = await myDocument.incrementalPatch({
age: 10
const latestDoc = myDocument.getLatest();
console.log(docAfterEdit === latestDoc); // > true

Observe $

Calling this will return an rxjs-Observable which the current newest state of the RxDocument.

// get all changeEvents
.subscribe(currentRxDocument => console.dir(currentRxDocument));


This removes the document from the collection. Notice that this will not purge the document from the store but set _deleted:true so that it will be no longer returned on queries. To fully purge a document, use the cleanup plugin.



Emits a boolean value, depending on whether the RxDocument is deleted or not.

let lastState = null;
myDocument.deleted$.subscribe(state => lastState = state);

// false

await myDocument.remove();

// true

get deleted

A getter to get the current value of deleted$.

// false

await myDocument.remove();

// true


Returns the document's data as plain json object. This will return an immutable object. To get something that can be modified, use toMutableJSON() instead.

const json = myDocument.toJSON();
/* { passportId: 'h1rg9ugdd30o',
firstName: 'Carolina',
lastName: 'Gibson',
age: 33 ...

You can also set withMetaFields: true to get additional meta fields like the revision, attachments or the deleted flag.

const json = myDocument.toJSON(true);
/* { passportId: 'h1rg9ugdd30o',
firstName: 'Carolina',
lastName: 'Gibson',
_deleted: false,
_attachments: { ... },
_rev: '1-aklsdjfhaklsdjhf...'


Same as toJSON() but returns a deep cloned object that can be mutated afterwards. Remember that deep cloning is performance expensive and should only be done when necessary.

const json = myDocument.toMutableJSON();
json.firstName = 'Alice'; // The returned document can be mutated
All methods of RxDocument are bound to the instance

When you get a method from a RxDocument, the method is automatically bound to the documents instance. This means you do not have to use things like myMethod.bind(myDocument) like you would do in jsx.


Returns true if the given object is an instance of RxDocument. Returns false if not.

const is = isRxDocument(myObj);