magnolia

Beautiful MongoDB wrapper using Q

magnolia–A beautiful MongoDB driver w/ Q

Magnolia implements a coherent, lazy, & chainable interface... with promises! Don't nest callbacks anymore than you have to!

If you don't mind state, you can init the module's state with default options.

var mongo = require('magnolia'),
    ObjectID = mongo.ObjectID;
 
mongo
    .server({host: 'localhost', port: 27117)
    .db('hello')
    .options({w: 1})
    .init(); // makes all the previous calls stored as defaults 

Or you can start a chain with the defaults you would like.

var mongo = require('magnolia')
    .server({host: 'localhost', port: 27117)
    .db('hello')
    .options({w: 1});
  • magnolia(collection, [db])
  • .collection(collection)
  • .db(db)
  • .server(server)
  • .options(...)
    • m:1
    • journal:true
    • fsync:true
    • slaveOk:true
magnolia('user')
    .filter({_id: ObjectID('4e4e1638c85e808431000003')}) // filter! 
    .one() // just find one! 
    .then(function (user) { // evaluate as a promise 
        console.log('hello', user.name);
    });
 
magnolia('user')
    .filter({hello: 'world'})
    .toArray(function (errdocs) { /* ... */ });
  • .toArray([cb]) Query the collection, otherwise it will be lazily queried when you evaluate the chain as a promise
  • .filter(criteria) Filter the collection
  • .one() Find one! And return the document, instead of a list.
  • .limit(n).skip(m) to control paging.
  • .sort(fields) Order by the given fields. There are several equivalent syntaxes:
    • .sort([['field1', 'desc'], ['field2', 'asc']])
    • .sort([['field1', 'desc'], 'field2'])
    • .sort('field1') ascending by field1
magnolia('user')
    .filter(query)
    .sort(sort)
    .options(options)
    .findAndModify(objNew, [options], [callback]);

Useful options (including the previous options):

  • .filter(...)
  • .sort(...)
  • .options(...)
    • remove:true set to a true to remove the object before returning
    • new:true set to true if you want to return the modified object rather than the original. Ignored for remove.
    • upsert:true Atomically inserts the document if no documents matched.
magnolia('user')
    .filter(query)
    .remove(extra_query)
    .then(function (remove_count) { /* ... */ });
magnolia('user')
    .insert({name: 'ryan', company: 'Submersible'}, {safe: true})
    .then(function (doc) { /* ... */ });
 
magnolia('user')
    .safe()
    .insert([{foo: 'bar'}, {hello: 'world'}], function (errdocs) {
        /* ... */
    });
  • .safe() or .unsafe() Make sure document is in the database before returning
  • .options(...)
    • safe:true

Signature:

magnolia('user')
    .filter(criteria)
    .update(update, [options], [callback]);
magnolia('user')
    .filter(criteria)
    .upsert(objNew, [options], [callback]);

Useful options:

  • .filter(...)
  • .one() or .multi()
  • .safe() or .unsafe()
  • .options(...)
    • safe:true Should always set if you have a callback.
    • multi:true If set, all matching documents are updated, not just the first.
    • upsert:true Atomically inserts the document if no documents matched.

Performs an update if there's an _id, and an insert if not!

magnolia('user').save({_id: ObjectID('50c03c9c766c8598e0000002'), foo: 'bar'}); // update 
magnolia('user').save({hello: 'world'}); // insert 
magnolia('user').count([filter], [cb]);
magnolia.Long(numberString)
magnolia.ObjectID(hexString)
magnolia.Timestamp()
magnolia.DBRef(collectionName, id, dbName)
magnolia.Binary(buffer)
magnolia.Code(code, [context])
magnolia.Symbol(string)
magnolia.MinKey()
magnolia.MaxKey()
magnolia.Double(number)
  1. Think of things that are left todo

  2. commands

  3. insert DONE

  4. remove DONE

  5. update DONE

  6. count DONE

  7. upsert DONE

  8. findAndModify DONE

  9. toArray DONE

  10. nextObject

  11. each

  12. ensureIndex?

  13. wtf is aggregation?

  14. mapreduce

  15. db

  16. collection

  17. server

  18. wrap the data types

  19. can i test a bad connection?

  20. features

  21. nextObject

  22. each

  23. ensureIndex

  24. map/reduce

  25. queueing, max connections

  26. raw mongodb connection

  27. fix

  28. find's limit & sort

  29. does server work?

  1. think of the options, and what can be made coherent
  2. do it!
  3. write test for that method
  4. document