Last active
December 14, 2015 02:49
-
-
Save saml/5016730 to your computer and use it in GitHub Desktop.
mongodb query builder
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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