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

moongoose

v0.0.5

Published

![moongoose](https://i.kinja-img.com/gawker-media/image/upload/s--wbCHfA3R--/c_fit,fl_progressive,q_80,w_636/17hnwnvcypnk6jpg.jpg)

Downloads

2,140

Readme

moongoose

Q: Why do people use mongoose?

Here are some of the benefits:

  • You can execute commands right away without having to wait for mongo.connect()
  • You get schema validation
  • You can create synthetic joins via populate

However, there are some potential downsides:

  • Mongoose is global object - causing potential conflicts
  • Mongoose can be very slow with all the getters, setters and whatnot
  • the lean() options ends up being slower than native
  • It can be difficult to understand what is going on behind the scenes
  • The schema is non-standard

Moongoose to the rescue

  • Just over 100 LOC - simple wrapper around native
  • No need to wait for connection before executing commands
  • Efficient populate for streaming and findOnes
  • Validation with JSON schema
  • Acts global but can be cloned for ringfencing different instances

Examples

Example: fetching data

var moongoose = require('moongoose');

moongoose.connect('mongodb://localhost:27017/test');

// Find one record and populate
moongoose.collection('test')
  .findOne({})
  .populate('org_id','orgs')
  .then(console.log);

// Find all record, populate and stream
moongoose.collection('test')
  .find()
  .populate('org_id','orgs')
  .stream()
  .pipe(...);

// Find all records, poopulate and capture into array
moongoose.collection('test')
  .find()
  .populate('org_id','orgs')
  .toArray()
  .then(console.log)

Example: save a record with validation

var test = moongoose.collection('test',{
  schema: {
    additionalProperties: false,
    properties: {
      answer: {type:'boolean'},
      fail: {type:'boolean'}
    }
  },
  validate : function(data) {
    if (data.fail)
      throw 'Failed custom validation';
  }
});

// This successfully save the record - junk is removed in validation
test.save({
  answer: true,
  junk: 'this gets removed'
})
.then(d => console.log(d.ops[0]),console.log);

// This fails validation and is not saved
test.save({
  answer: 'not a boolean'
})
.then(d => console.log(d.ops[0]),console.log);

// This passes json-schema validation but fails custom validation
test.save({
  answer: true,
  fail: true
})
.then(d => console.log(d.ops[0]),console.log);