diff --git a/lib/find_options.js b/lib/find_options.js index 74ac876..fe68458 100644 --- a/lib/find_options.js +++ b/lib/find_options.js @@ -1,5 +1,15 @@ var ObjectID = require('../').ObjectID; +// check to see if all values are 1/-1 +function is_fields(obj) { + for (prop in obj) { + if (Math.abs(obj[prop]) !== 1) { + return false + } + } + return true +} + module.exports = function find_options(args) { if(!args) args = []; var signature = Array.prototype.map.call(args, function(arg){ return Array.isArray(arg)? "array" : typeof arg }).join(); @@ -28,16 +38,21 @@ module.exports = function find_options(args) { //selector, fields, callback? //selector, options, callback? case "object,object": + case "object,undefined": case "object,undefined,function": case "object,object,function": //sniff for a 1 or -1 to detect fields object - if(!args[1] || Math.abs(args[1][0])===1) { + if(!args[1] || is_fields(args[1])) { options.fields = args[1]; } - else { + else { if(args[1].skip) options.skip = args[1].skip; if(args[1].limit) options.limit = args[1].limit; - if(args[1].fields) options.fields = args[1].fields; + if(args[1].fields) { + options.fields = args[1].fields; + } else { + options.fields = {} + } if(args[1].projection) options.fields = args[1].projection; } break; diff --git a/test/options.test.js b/test/options.test.js index 36b91a0..83f17f5 100644 --- a/test/options.test.js +++ b/test/options.test.js @@ -41,6 +41,10 @@ describe('options tests', function () { var options = find_options({_id:"ABC123"}, undefined, cb); options.should.eql({ callback:cb, fields:undefined, limit:0, query:{_id:"ABC123"}, skip:0 }); }); + it('should accept signature: "selector, undefined"', function(){ + var options = find_options({_id:"ABC123"}, undefined); + options.should.eql({ callback: undefined, fields:undefined, limit:0, query:{_id:"ABC123"}, skip:0 }); + }); it('should accept signature: "selector, options"', function(){ var options = find_options({_id:"ABC123"}, {fields:{_id:-1}, skip:100}); options.should.eql({ callback:undefined, fields:{_id:-1}, limit:0, query:{_id:"ABC123"}, skip:100 }); @@ -49,6 +53,14 @@ describe('options tests', function () { var options = find_options({_id:"ABC123"}, {projection:{_id:-1}, skip:100}); options.should.eql({ callback:undefined, fields:{_id:-1}, limit:0, query:{_id:"ABC123"}, skip:100 }); }); + it('should accept limit:1, fields:undefined as options: "selector, options"', function(){ + var options = find_options({_id:"ABC123"}, {limit:1, fields:undefined}); + options.should.eql({ callback:undefined, fields:{}, limit:1, query:{_id:"ABC123"}, skip:0 }); + }); + it('should accept limit:1, fields:{...} as options: "selector, options"', function(){ + var options = find_options({_id:"ABC123"}, {limit:1, fields:{"a":1}}); + options.should.eql({ callback:undefined, fields:{"a":1}, limit:1, query:{_id:"ABC123"}, skip:0 }); + }); it('should accept signature: "selector, options, callback"', function(){ var options = find_options({_id:"ABC123"}, {fields:{_id:-1}, skip:100}, cb); options.should.eql({ callback:cb, fields:{_id:-1}, limit:0, query:{_id:"ABC123"}, skip:100 });