Skip to content

Instantly share code, notes, and snippets.

@saml
Last active December 14, 2015 02:49
Show Gist options
  • Save saml/5016730 to your computer and use it in GitHub Desktop.
Save saml/5016730 to your computer and use it in GitHub Desktop.
mongodb query builder
//query builder
var q = new (function() {
this.has = function(key, exists) {
if (typeof exists === 'undefined') {
//default, query for documents that has they key.
exists = true;
}
var query = {};
query[key] = {$exists: exists};
return query;
};
this.typeNames = {
Double: 1,
String: 2,
Object: 3,
Array: 4,
Binary: 5,
Id: 7,
Boolean: 8,
Date: 9,
Null: 10,
RegExp: 11,
Javascript: 13,
Symbol: 14,
JavascriptWithScope: 15,
Int32: 16,
Timestamp: 17,
Int64: 18
};
this.size = function(key, n) {
var query = {};
query[key] = {$size: n};
return query;
};
this.is = function(key, typeName) {
if (typeName === 'Array') {
//special case for mangodb. https://jira.mongodb.org/browse/SERVER-1475
return this.or(this.has(key + '.0'), this.size(key, 0));
}
var type = this.typeNames[typeName];
return this.and(this.has(key + '.0', false), this.eq(key, {$type: type}));
};
this.and = function() {
var args = Array.slice(arguments);
return {$and: args};
};
this.or = function() {
var args = Array.slice(arguments);
return {$or: args};
};
this.nempty = function(key) {
return this.ne(key, '', this.has(key));
};
this.eq = function(key, val) {
var query = {};
query[key] = val;
return query;
};
this.ne = function(key, val, query) {
if (!query) {
query = {};
}
if (!query[key]) {
query[key] = {};
}
query[key]['$ne'] = val;
return query;
};
this.match = function(key, re) {
var query = {};
query[key] = {$regex: re};
return query;
};
this.show = function() {
var args = Array.slice(arguments);
var projection = {};
args.forEach(function(arg) {
projection[arg] = 1;
});
return projection;
};
});
// convenience
var u = new (function() {
var me = this;
var DEFAULT_COLLECTION = db.Listing;
var DEFAULT_PROJECTION = 'metadata.url';
me.projection = function(key) {
return q.show(DEFAULT_PROJECTION, key);
};
me.distinct = function(key) {
var collection = COLLECTION || DEFAULT_COLLECTION;
return collection.distinct(key);
};
me.find_has = function(key) {
var collection = COLLECTION || DEFAULT_COLLECTION;
return collection.find(q.has(key), me.projection(key));
};
me.find_nempty = function(key) {
var collection = COLLECTION || DEFAULT_COLLECTION;
return collection.find(q.nempty(key), me.projection(key));
};
me.find_ne = function(key, val) {
var collection = COLLECTION || DEFAULT_COLLECTION;
return collection.find(q.and(q.has(key), q.ne(key, val)), me.projection(key));
};
me.find_eq = function(key, val) {
var collection = COLLECTION || DEFAULT_COLLECTION;
return collection.find(q.eq(key, val), me.projection(key));
};
me.find_match = function(key, regex) {
var collection = COLLECTION || DEFAULT_COLLECTION;
return collection.find(q.match(key, regex), me.projection(key));
};
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment