From 1b1ddf103edcca815738a1e6a0f92d1f58ed3cbc Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Wed, 24 Jun 2015 10:56:17 +1000 Subject: [PATCH] field sort order: _id on top, case-insensitive. --- lib/field-collection.js | 9 +++++++++ test/field-order.test.js | 26 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 test/field-order.test.js diff --git a/lib/field-collection.js b/lib/field-collection.js index 6eee95c..c93fff2 100644 --- a/lib/field-collection.js +++ b/lib/field-collection.js @@ -4,6 +4,15 @@ var Collection = require('./collection'); * Container for a list of Fields. */ var FieldCollection = Collection.extend({ + comparator: function (a, b) { + // make sure _id is always at top, even in presence of uppercase fields + var aId = a.getId(); + var bId = b.getId(); + if (aId === '_id') return -1; + if (bId === '_id') return 1; + // otherwise sort case-insensitively + return (aId.toLowerCase() < bId.toLowerCase()) ? -1 : 1; + }, model: function(attrs, options) { return new attrs.klass(attrs, options); } diff --git a/test/field-order.test.js b/test/field-order.test.js new file mode 100644 index 0000000..9bdd676 --- /dev/null +++ b/test/field-order.test.js @@ -0,0 +1,26 @@ +var getSchema = require('../'); +var assert = require('assert'); +var debug = require('debug')('mongodb-schema:test:field-order'); + +describe('order of fields', function () { + it('should have _id fields always at top, even with uppercase fields', function(done) { + var docs = [ {FOO: 1, _id: 1, BAR: 1, zoo: 1} ]; + getSchema('field.order', docs, function (err, schema) { + assert.ifError(err); + assert.deepEqual(schema.fields.map(function (field) { + return field.getId(); + }), ['_id', 'BAR', 'FOO', 'zoo']); + done(); + }); + }); + it('should sort in case-insensitive manner', function (done) { + var docs = [ {cb: 1, Ca: 1, cC: 1, a:1, b: 1} ]; + getSchema('field.order', docs, function (err, schema) { + assert.ifError(err); + assert.deepEqual(schema.fields.map(function (field) { + return field.getId(); + }), ['a', 'b', 'Ca', 'cb', 'cC']); + done(); + }); + }); +});