Skip to content

Autoupdating Collections

obeliskos edited this page Feb 1, 2018 · 3 revisions

The Autoupdate Feature for Collections

Autoupdate can be enabled on a per-collection basis via the constructor option autoupdate: true. The feature requires Object.observe (currently implemented in Chrome 36+, io.js and Node.js 0.12+). If observers are not available, the option will be ignored.

Autoupdate automatically calls update(doc) whenever a document is modified, which is necessary for index updates and dirty-marks (used to determine whether the DB has been modified and should be persisted).

Enabling this feature basically means, that all manual update calls can be omitted.

Example

var doc = collection.by("name", "John");

doc.name = "Peter";
doc.age = 32;
doc.gender = "male";

collection.update(doc); // This line can be safely removed.

Autoupdate will call update at the end of the current event loop cycle and thus only calls update once, even when multiple changes were made.

Error handling

There is one important difference between autoupdate and manual updates. If for example a document change violates a unique key constraint, update will synchronously throw an error which can be catched synchronously:

var collection = db.addCollection("test", {
  unique: ["name"]
});

collection.insert({ name: "Peter" });

var doc = collection.insert({ name: "Jack" });
doc.name = "Peter";

try {
  collection.update(doc);
} catch(err) {
  doc.name = "Jack";
}

Since autoupdate calls update asynchronously, you cannot catch errors via try-catch. Instead you have to use event listeners:

var collection = db.addCollection("test", {
  unique: ["name"],
  autoupdate: true
});

collection.insert({ name: "Peter" });

var doc = collection.insert({ name: "Jack" });
doc.name = "Peter";

collection.on("error", function(errDoc) {
  if(errDoc === doc) {
    doc.name = "Jack";
  }
});

This can become quite tedious, so you should consider performing checks before updating documents instead.