diff --git a/lib/query.js b/lib/query.js index 9abbe195546..2a99bae0840 100644 --- a/lib/query.js +++ b/lib/query.js @@ -139,15 +139,7 @@ Query.prototype.toConstructor = function toConstructor () { p.options = {}; - // this is an ugly hack to deal with the terrible way that sort information - // is internally stored. [[field, 1]] syntax is causing trouble when we are - // calling `sort` via `apply` and the arguments are getting passed - // incorrectly - var opts = utils.clone(this.options); - if (opts.sort) { - opts.sort = [opts.sort]; - } - p.setOptions(opts); + p.setOptions(this.options); p.op = this.op; p._conditions = utils.clone(this._conditions); @@ -849,16 +841,6 @@ Query.prototype.setOptions = function (options, overwrite) { return this; } - // more terrible hacks to deal with the awful storage format of `sort`! - // This mainly comes up due to weird stuff with `toConstructor()` - if (options.sort) { - if (Array.isArray(options.sort)) { - if (Array.isArray(options.sort[0]) && !Array.isArray(options.sort[0][0])) { - options.sort = [options.sort]; - } - } - } - return Query.base.setOptions.call(this, options); } diff --git a/package.json b/package.json index e95d355c5d4..c86ecb472fc 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ , "mpromise": "0.3.0" , "mpath": "0.1.1" , "regexp-clone": "0.0.1" - , "mquery" : "0.2.4" + , "mquery" : "0.2.6" } , "devDependencies": { "mocha": "1.12.0" diff --git a/test/model.findAndRemoveOne.test.js b/test/model.findAndRemoveOne.test.js index 6080a5f212c..32de0e3dffd 100644 --- a/test/model.findAndRemoveOne.test.js +++ b/test/model.findAndRemoveOne.test.js @@ -304,18 +304,14 @@ describe('model: findByIdAndRemove:', function(){ , query; query = M.findByIdAndRemove(_id, { sort: 'author -title' }); - assert.equal(2, query.options.sort.length); - assert.equal('author', query.options.sort[0][0]); - assert.equal(1, query.options.sort[0][1]); - assert.equal('title', query.options.sort[1][0]); - assert.equal(-1, query.options.sort[1][1]); + assert.equal(2, Object.keys(query.options.sort).length); + assert.equal(1, query.options.sort.author); + assert.equal(-1, query.options.sort.title); query = M.findOneAndRemove({}, { sort: 'author -title' }); - assert.equal(2, query.options.sort.length); - assert.equal('author', query.options.sort[0][0]); - assert.equal(1, query.options.sort[0][1]); - assert.equal('title', query.options.sort[1][0]); - assert.equal(-1, query.options.sort[1][1]); + assert.equal(2, Object.keys(query.options.sort).length); + assert.equal(1, query.options.sort.author); + assert.equal(-1, query.options.sort.title); done(); }) @@ -330,18 +326,14 @@ describe('model: findByIdAndRemove:', function(){ , query; query = M.findByIdAndRemove(_id, { sort: { author: 1, title: -1 }}); - assert.equal(2, query.options.sort.length); - assert.equal('author', query.options.sort[0][0]); - assert.equal(1, query.options.sort[0][1]); - assert.equal('title', query.options.sort[1][0]); - assert.equal(-1, query.options.sort[1][1]); + assert.equal(2, Object.keys(query.options.sort).length); + assert.equal(1, query.options.sort.author); + assert.equal(-1, query.options.sort.title); query = M.findOneAndRemove(_id, { sort: { author: 1, title: -1 }}); - assert.equal(2, query.options.sort.length); - assert.equal('author', query.options.sort[0][0]); - assert.equal(1, query.options.sort[0][1]); - assert.equal('title', query.options.sort[1][0]); - assert.equal(-1, query.options.sort[1][1]); + assert.equal(2, Object.keys(query.options.sort).length); + assert.equal(1, query.options.sort.author); + assert.equal(-1, query.options.sort.title); done(); }); diff --git a/test/model.findAndUpdateOne.test.js b/test/model.findAndUpdateOne.test.js index 1c97d359c9b..c09f15266d0 100644 --- a/test/model.findAndUpdateOne.test.js +++ b/test/model.findAndUpdateOne.test.js @@ -669,18 +669,14 @@ describe('model: findByIdAndUpdate:', function(){ , query; query = M.findByIdAndUpdate(_id, { $set: { date: now }}, { sort: 'author -title' }); - assert.equal(2, query.options.sort.length); - assert.equal('author', query.options.sort[0][0]); - assert.equal(1, query.options.sort[0][1]); - assert.equal('title', query.options.sort[1][0]); - assert.equal(-1, query.options.sort[1][1]); + assert.equal(2, Object.keys(query.options.sort).length); + assert.equal(1, query.options.sort.author); + assert.equal(-1, query.options.sort.title); query = M.findOneAndUpdate({}, { $set: { date: now }}, { sort: 'author -title' }); - assert.equal(2, query.options.sort.length); - assert.equal('author', query.options.sort[0][0]); - assert.equal(1, query.options.sort[0][1]); - assert.equal('title', query.options.sort[1][0]); - assert.equal(-1, query.options.sort[1][1]); + assert.equal(2, Object.keys(query.options.sort).length); + assert.equal(1, query.options.sort.author); + assert.equal(-1, query.options.sort.title); done(); }) @@ -695,18 +691,14 @@ describe('model: findByIdAndUpdate:', function(){ , query; query = M.findByIdAndUpdate(_id, { $set: { date: now }}, { sort: { author: 1, title: -1 }}); - assert.equal(2, query.options.sort.length); - assert.equal('author', query.options.sort[0][0]); - assert.equal(1, query.options.sort[0][1]); - assert.equal('title', query.options.sort[1][0]); - assert.equal(-1, query.options.sort[1][1]); + assert.equal(2, Object.keys(query.options.sort).length); + assert.equal(1, query.options.sort.author); + assert.equal(-1, query.options.sort.title); query = M.findOneAndUpdate(_id, { $set: { date: now }}, { sort: { author: 1, title: -1 }}); - assert.equal(2, query.options.sort.length); - assert.equal('author', query.options.sort[0][0]); - assert.equal(1, query.options.sort[0][1]); - assert.equal('title', query.options.sort[1][0]); - assert.equal(-1, query.options.sort[1][1]); + assert.equal(2, Object.keys(query.options.sort).length); + assert.equal(1, query.options.sort.author); + assert.equal(-1, query.options.sort.title); done(); }); diff --git a/test/query.test.js b/test/query.test.js index 5d4c74e8dae..c6e7fe742ce 100644 --- a/test/query.test.js +++ b/test/query.test.js @@ -676,10 +676,10 @@ describe('Query', function(){ it('works', function(done){ var query = new Query({}, {}, null, p1.collection); query.sort('a -c b'); - assert.deepEqual(query.options.sort, [['a', 1], ['c', -1], ['b', 1]]); + assert.deepEqual(query.options.sort, {'a': 1 , 'c': -1,'b': 1}); query = new Query({}, {}, null, p1.collection); query.sort({'a': 1, 'c': -1, 'b': 'asc', e: 'descending', f: 'ascending'}); - assert.deepEqual(query.options.sort, [['a', 1], ['c', -1], ['b', 'asc'], ['e', 'descending'], ['f', 'ascending']]); + assert.deepEqual(query.options.sort, {'a': 1, 'c': -1, 'b': 1, 'e': -1, 'f': 1}); query = new Query({}, {}, null, p1.collection); var e; @@ -1367,11 +1367,9 @@ describe('Query', function(){ assert.equal(q.options.batchSize, 10); assert.equal(q.options.limit, 4); assert.equal(q.options.skip, 3); - assert.equal(q.options.sort.length, 2); - assert.equal(q.options.sort[0][0], 'blah'); - assert.equal(q.options.sort[0][1], -1); - assert.equal(q.options.sort[1][0], 'woot'); - assert.equal(q.options.sort[1][1], -1); + assert.equal(Object.keys(q.options.sort).length, 2); + assert.equal(q.options.sort.blah, -1); + assert.equal(q.options.sort.woot, -1); assert.equal(q.options.hint.index1, 1); assert.equal(q.options.hint.index2, -1); assert.equal(q.options.readPreference.mode, 'secondary'); diff --git a/test/query.toconstructor.test.js b/test/query.toconstructor.test.js index 9effc679185..d8ced0c0217 100644 --- a/test/query.toconstructor.test.js +++ b/test/query.toconstructor.test.js @@ -26,7 +26,7 @@ var cName = 'Comment' + random(); mongoose.model(prodName, Product); mongoose.model(cName, Comment); -describe('Query: ', function(){ +describe('Query:', function(){ describe('toConstructor', function () { it('creates a query', function (done) { var db = start(); @@ -111,7 +111,7 @@ describe('Query: ', function(){ var nq = prodC(null, { limit : 3 }); assert.deepEqual(nq._mongooseOptions, { lean : true, limit : 3 }); - assert.deepEqual(nq.options, { sort : [['title', 1]], limit : 3 }); + assert.deepEqual(nq.options, { sort : { 'title': 1 }, limit : 3 }); done(); })