Search code examples
node.jsarangodbarangojs

How to check if a collection already exists in ArangoDB


Say I have a collection Col1 that already exists in my database. So, doing something like:

var col = db.collection('Col1');
col.save({"name":"something"});

will work perfectly fine.

But if a collection Col2 that doesn't already exist in my database is tried with the same thing i.e

var col = db.collection('Col2');
col.save({"name":"something"})

will work perfectly fine as well. Only that it doesn't exist and will be not shown in my database. Had it thrown some error or stuffs I could have used try and catch statements for result. But since that is off the plate, how do I know if a collection already exists ?


Solution

  • There are two things going on here that may be confusing.

    First of all, arangojs (unlike the internal JS API of ArangoDB) is asynchronous for everything that needs to talk to the actual ArangoDB server. Asynchronous functions are marked as "async" in the documentation.

    You can pass a node.js-style callback (like the async functions in built-in node.js modules, e.g. fs, http, etc) to these methods. Alternatively you can simply omit the callback and the method will return a promise for the result. You can learn more about how promises work in Mozilla's JavaScript reference documentation (this is not specific to Mozilla -- their reference is just very good and generally correct).

    The other thing you're running into is the distinction between collection objects in arangojs and actual collections in ArangoDB. The driver lets you create collection objects for collections regardless of whether they exist yet or not. When trying to use them if the collection doesn't actually exist, you will of course see an error.

    var col = db.collection('whatever');
    col.create() // create the collection if it doesn't exist
    .catch(function () {}) // ignore any errors
    .then(function () {
      return col.get(); // make sure the collection exists now
    })
    .then(function () {
      return col.save({some: 'data'});
    })
    .then(function (result) {
      // everything went fine
    })
    .catch(function (e) {
      console.error('Something went wrong', e.stack);
    });
    

    Or using async/await (if you use Babel or read this answer one year from now):

    var col = db.collection('whatever');
    try {
      await col.create(); // create the collection if it doesn't exist
    } catch (e) {} // ignore any errors
    try {
      await col.get(); // make sure the collection exists now
      const result = await col.save({some: 'data'});
      // everything went fine
    } catch (e) {
      console.error('Something went wrong', e.stack);
    }
    

    Or using node.js-style callbacks because you're oldschool or really like pyramids:

    var col = db.collection('whatever');
    col.create(function () { // create the collection if it doesn't exist
      // ignore any errors
      col.get(function (err) { // make sure the collection exists now
        if (err) {
          console.error('Something went wrong', err.stack);
          return;
        }
        col.save({some: 'data'}, function (err, result) {
          if (err) {
            console.error('Something went wrong', err.stack);
            return;
          }
          // everything went fine
        });
      });
    });