Quick tip: Share a large MongoDB query object between the CLI and Node.js

May 24, 2012

I was writing a very long MongoDB query in JSON that needed to work both in a Mongo CLI script and in a Node.js app. Duplicating the JSON for the query across both raised the risk of one changing without the other. So I dug around for a way to share them and came up with this:

Create a query.js file, like so (the query is just an example, substitute your own):

// dual-purpose, include me in mongo cli or node.js
var module = module || {};    // filler for mongo CLI

// query here is for mongo cli. module.exports is for node.js
var query = module.exports = {
  '$and' : [
    { '$or' : [ 
      { someField: { '$exists': false } }, 
      { someOtherField: 0 } 
    ] },

    { '$or' : [ 
      { 'endDate' : { '$lt' : new Date() } },
      { 'endDate' : { '$exists' : false } }
    ] }

    // ...  
  ]
};

Then in your mongo CLI script, use

load('./query.js');   // sets query var

db.items.find(
    query,

    {
      // fields to select ...
    }
  )
  .sort({
    // etc...
  });

In your Node.js app, use var query = require(‘./query.js’); and plug the same query into your MongoDB driver or Mongoose find function. Duplication avoided!