diff --git a/spec/QueryTools.spec.js b/spec/QueryTools.spec.js index 8c18782968..50433f5805 100644 --- a/spec/QueryTools.spec.js +++ b/spec/QueryTools.spec.js @@ -112,6 +112,20 @@ describe('matchesQuery', function() { expect(matchesQuery(obj, q)).toBe(false); }); + it('matches queries with doesNotExist constraint', function() { + var obj = { + id: new Id('Item', 'O1'), + count: 15 + }; + var q = new Parse.Query('Item'); + q.doesNotExist('name'); + expect(matchesQuery(obj, q)).toBe(true); + + q = new Parse.Query('Item'); + q.doesNotExist('count'); + expect(matchesQuery(obj, q)).toBe(false); + }); + it('matches on equality queries', function() { var day = new Date(); var location = new Parse.GeoPoint({ diff --git a/src/LiveQuery/QueryTools.js b/src/LiveQuery/QueryTools.js index 5710c8c973..adbc4deece 100644 --- a/src/LiveQuery/QueryTools.js +++ b/src/LiveQuery/QueryTools.js @@ -206,7 +206,9 @@ function matchesKeyConstraints(object, key, constraints) { } break; case '$exists': - if (typeof object[key] === 'undefined') { + let propertyExists = typeof object[key] !== 'undefined'; + let existenceIsRequired = constraints['$exists']; + if ((!propertyExists && existenceIsRequired) || (propertyExists && !existenceIsRequired)) { return false; } break;