npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

yieldb

v2.7.1

Published

Simple, expressive and yieldable MongoDB for co and koa

Downloads

20

Readme

yieldb

Simple, expressive and yieldable MongoDB for co/koa.

Build Status Coverage Status npm

var co = require('co');
var connect = require('yieldb').connect;

co(function*(){
  var db = yield connect(url);

  var User = db.col('users');

  yield User.insert(doc)    // promise/thunk
  yield User.findOne(id)    // mquery
  yield User.remove(id)     // mquery
  yield User.update(id, { $set: .. })    // mquery
  yield User.findAndModify(id, modifier) // mquery
  yield User.remove(id)     // mquery
})()

yieldb makes working with mongodb and co/koa a breeze.

connect

Connecting to mongodb is easy.

var co = require('co');
var connect = require('yieldb').connect;

co(function*(){
  var db = yield connect(mongodbUri [, options]);
})()

Replica-sets, sharding and all the features available through the mongodb driver are supported out of the box.

collections

yieldb Collections provide a simple, constistent interface to work with mongodb collections. Call db.col(collectionName) to get a collection.

var co = require('co');
var connect = require('yieldb').connect;

co(function*(){
  var db = yield connect(mongodbUri [, options]);

  // get a collection
  var User = db.col('users');

  // look up a user
  var doc = yield User.findOne(id);
})()

Key features:

yieldable

Each collection method returns a yieldable. For example:

var User = db.col('users');

yield User.insert({ name: 'yieldb' });
var doc = yield User.find({ name: 'yieldb' });

Note that these yieldables are also Promises for maximal compatibility with other modules:

var User = db.col('users');

User.insert({ name: 'yieldb' }).then(function(function() {
  User.find({ name: 'yieldb' }).then(function(doc) {
    console.log(doc);
  }, onFail);
}, onFail);

_id casting

Any collection method which accepts selector arguments will benefit from auto-casting _id hexStrings to ObjectId. For example:

var User = db.col('users');
var ObjectId = require('mongodb').ObjectID;

// the following are equivalent
var doc = yield User.findOne('541b432d84dd6253074aabe6');
var doc = yield User.findOne({ _id: '541b432d84dd6253074aabe6' });
var doc = yield User.findOne({ _id: new ObjectId('541b432d84dd6253074aabe6') });

query building

Where it makes sense, collection methods return an instance of mquery. This means you can use all the query builder helper methods in mquery.

var User = db.col('users');
var docs = yield User.find({ role: 'developer' })
                     .limit(10)
                     .sort({ name: 'desc' })
                     .read('primaryPreferred');

The methods which do not return an mquery are

  • insert()
  • drop()
  • index()
  • indexes().
  • aggregate()

However, these methods do return Promises like every other collection method. In the future, aggregate will likely return an mquery once support has been added.

promises

As mentioned above, all collection methods return Promises. Since most collection methods also return an mquery instance, we get Promise support for free everywhere. Call the query builders then() method anywhere in the chain to receive a bluebird Promise.

db.col('stats').where({ count: { $gt: 100 }})
               .then(JSON.stringify)
               .then(respond)
               .catch(handleError)

db methods

col(name)

Returns a collection instance

var users = db.col('users');

close

Returns a promise which closes the db connection.

yield db.close();

drop

Returns a promise which deletes the entire database.

yield db.drop();

listCollections

Returns a promise which lists existing collections in the database.

yield db.listCollections();

ping

Returns a promise which sends a ping to the database.

yield db.ping();

serverStatus

Returns a promise which responds with MongoDB status.

yield db.serverStatus();

collection methods

find

Returns a yieldable mquery instance.

yield db.col('watches').find(selector, options);

findOne

Returns a yieldable mquery instance.

yield db.col('watches').findOne(selector, options);

insert

Accepts either a single object or array of objects. Objects which do not have an _id will receive one assigned a new ObjectId. Returns a yieldable promise;

yield db.col('watches').insert(obj, options);
yield db.col('watches').insert([obj1, obj2, ..], options);

update

Returns a yieldable mquery instance.

yield db.col('watches').update(selector, update, options);
Default options:
{ multi: true, fullResult: true }

remove

Returns a yieldable mquery instance.

yield db.col('watches').remove(selector, options);

drop

Returns a yieldable promise.

yield db.col('watches').drop();

aggregate

Accepts an array of pipeline operations and returns a yieldable promise.

yield db.col('watches').aggregate(pipeline);

The promise also has it's own stream() method if that's what you're after.

yield db.col('watches').aggregate(pipeline).stream();

findOneAndUpdate

Returns a yieldable mquery instance.

yield db.col('watches').findOneAndUpdate(selector, update, options)

findOneAndRemove

Returns a yieldable mquery instance.

yield db.col('watches').findOneAndRemove(selector, options)

count

Returns a yieldable mquery instance.

yield db.col('watches').count(selector, options)

distinct

Returns a yieldable mquery instance.

yield db.col('watches').distinct(key [, query]);

where

Returns a yieldable mquery instance.

yield db.col('watches').where(selector).select('name email')

index

Creates an index. Returns a yieldable promise.

yield db.col('watches').index(indexDefinition, options);

dropIndex

Drops an index. Returns a yieldable promise.

yield db.col('watches').dropIndex(indexDefinition);

indexes

Retreives an array of all defined indexes for this collection. Returns a yieldable promise.

var indexes = yield db.col('watches').indexes();

setOptions

Sets default collection options which apply to all methods of this collection.

var User = db.col('users');
User.setOptions({ maxTime: 500 });
yield User.find();

Options are passed to the mquery.setOptions method. All mquery options are supported.

Installation

npm install yieldb --save

Development

running tests

  • make test runs tests
  • make test-cov runs tests + test coverage
  • make open-cov opens test coverage results in your browser

verbose logging

yieldb supports the debug module for help during development. Enable verbose logging by setting your DEBUG env variable like so:

DEBUG=yieldb* npm test
```

## Sponsored by

[Pebble Technology!](https://getpebble.com)

## License

[MIT](https://github.com/pebble/yieldb/blob/master/LICENSE)