From a22793e443359c8ec4e4697a68dd74ab107fa7c2 Mon Sep 17 00:00:00 2001 From: Hugh Willson Date: Wed, 22 Feb 2017 12:15:11 -0500 Subject: [PATCH] Replaced an _.each call with a Object.keys().forEach call, to allow objects with length properties to be handled properly as Mongo selectors. (#8380) --- packages/mongo/collection.js | 6 +++--- packages/mongo/mongo_livedata_tests.js | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/mongo/collection.js b/packages/mongo/collection.js index 32fbe96633..68c7c31a28 100644 --- a/packages/mongo/collection.js +++ b/packages/mongo/collection.js @@ -378,7 +378,8 @@ Mongo.Collection._rewriteSelector = function (selector) { return {_id: Random.id()}; var ret = {}; - _.each(selector, function (value, key) { + Object.keys(selector).forEach((key) => { + const value = selector[key]; // Mongo supports both {field: /foo/} and {field: {$regex: /foo/}} if (value instanceof RegExp) { ret[key] = convertRegexpToMongoSelector(value); @@ -388,8 +389,7 @@ Mongo.Collection._rewriteSelector = function (selector) { // override the ones set on $regex. if (value.$options !== undefined) ret[key].$options = value.$options; - } - else if (_.contains(['$or','$and','$nor'], key)) { + } else if (_.contains(['$or','$and','$nor'], key)) { // Translate lower levels of $and/$or/$nor ret[key] = _.map(value, function (v) { return Mongo.Collection._rewriteSelector(v); diff --git a/packages/mongo/mongo_livedata_tests.js b/packages/mongo/mongo_livedata_tests.js index fba9d29cf9..242a28cb07 100644 --- a/packages/mongo/mongo_livedata_tests.js +++ b/packages/mongo/mongo_livedata_tests.js @@ -2198,6 +2198,18 @@ Tinytest.add('mongo-livedata - rewrite selector', function (test) { var oid = new Mongo.ObjectID(); test.equal(Mongo.Collection._rewriteSelector(oid), {_id: oid}); + + // Make sure selectors with "length" properties are handled properly + // (verifies issue #8329 has been resolved). + const SomeSelector = function (length) { + this.length = length; + }; + const length = 2; + const testSelector = new SomeSelector(length); + test.equal( + Mongo.Collection._rewriteSelector(testSelector), + { length } + ); }); testAsyncMulti('mongo-livedata - specified _id', [