Skip to content

tuxd/second-thought

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Some Light Abstraction for RethinkDB

The RethinkDB Node driver is already very simple to use, but there are methods that I wish I "just had" at the ready. Those are:

  • Query, which returns an array
  • First, Exists
  • Save, which upserts a record
  • Automatic table/db config
  • DB Manipulation (Create/Drop)

So I created it. That's what we have here.

Usage

Install using

npm install secondthought --save

To use this in your code, just configure what you need:

var db = require("second-thought");
db.connect({db : "test"}, function(err,db){

  //you now have access to all of your tables as properties on your db variable:
  //so, assume there's a table called "foo" in your db...
  db.foo.save({name : "Mike"}, function(err,saved){

    //output the generated ID
    console.log(saved.id);
  });

});

Each table on your DB object is a full-blown RethinkDB table, so you can step outside the abstraction at any point:

db.openConnection(function(err,conn){

  //this is a ReQL query
  db.foo.eqJoin('bar_id', db.bar).run(conn, function(err,cursor){

    //run the joined action and do something interesting
    cursor.toArray(function(err,array){
      //use the array...

      //be sure to close the connection!
      conn.close();
    });

  });
});

In addition you can do all kinds of fun things, like...

//installation of the DB and tables
db.connect({db : "test"}, function(err, db){
  db.install(['foo', 'bar'], function(err,result){
    //tables should be installed now...
  });
});

//add a secondary index
db.connect({db : "test"}, function(err,db){

  db.foo.index("email", function(err, indexed){
    //indexed == true;
  });
});

Basic Queries

I've tried to keep the API light and simple - with just a bit of sugar to keep the repetetive stuff to a minimum:

db.connect({db : "test", function(err,db){

  db.foo.query({category : "beer"}, function(err,beers){
    //beers is an array, so have at it
  });

  db.foo.first({email : "[email protected]"}, function(err,rob){
    //hi Rob
  });

  db.foo.exists({name : "bill"}, function(err, exists){
    //exists will tell you if it's there
  });

  db.foo.destroy({id : "some-id"}, function(err,destroyed){
    //destroyed will be true if something was deleted
  });

  db.foo.destroyAll(function(err,destroyed){
    //destroyed is the count of records whacked
  });

  db.foo.updateOnly({name : "Stevie"}, "some-id", function(err,result){
    //save will do a full swap of the document, updateOnly will partially update
    //a document so you need to pass the id along
    //result will be true if an update happened
  });

});

Have a look at the tests to see a bit more

Wanna Help?

Just do me a favor and open a PR with some ideas and hopefully a test or two. Thanks!

About

A light wrapper for RethinkDB

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 100.0%