56 lines
1.7 KiB
JavaScript
56 lines
1.7 KiB
JavaScript
// Test MQL expressions which can match against the whole array stored in the field.
|
|
(function() {
|
|
"use strict";
|
|
|
|
const coll = db.expressions_matching_whole_array;
|
|
coll.drop();
|
|
|
|
function testSingleDocument(document, query, shouldMatch) {
|
|
assert.commandWorked(coll.insert(document));
|
|
|
|
const result = coll.find(query).toArray();
|
|
if (shouldMatch) {
|
|
assert.eq(result.length, 1);
|
|
delete result[0]._id;
|
|
assert.docEq(document, result[0]);
|
|
} else {
|
|
assert.eq(result.length, 0);
|
|
}
|
|
|
|
assert(coll.drop());
|
|
}
|
|
|
|
function assertMatches(document, query) {
|
|
testSingleDocument(document, query, true);
|
|
}
|
|
|
|
function assertDoesNotMatch(document, query) {
|
|
testSingleDocument(document, query, false);
|
|
}
|
|
|
|
// $type
|
|
assertMatches({a: [1, 2, 3]}, {a: {$type: 'array'}});
|
|
assertMatches({a: []}, {a: {$type: 'array'}});
|
|
assertDoesNotMatch({a: 1}, {a: {$type: 'array'}});
|
|
|
|
// $in
|
|
assertMatches({a: [1, 2, 3]}, {a: {$in: [[1, 2, 3]]}});
|
|
assertDoesNotMatch({a: [1, 2, 3]}, {a: {$in: [[1, 2]]}});
|
|
|
|
assertMatches({a: []}, {a: {$in: [[]]}});
|
|
assertDoesNotMatch({a: []}, {a: {$in: [[1]]}});
|
|
|
|
// $where matches ONLY against whole arrays.
|
|
assertMatches({a: [1]}, {$where: 'Array.isArray(this.a) && this.a.length == 1 && this.a[0] == 1'});
|
|
assertDoesNotMatch({a: [1, 2, 3]}, {$where: 'this.a == 1'});
|
|
|
|
// Comparison expressions match whole array only when RHS has array, MaxKey or MinKey types.
|
|
assertMatches({a: [1, 2, 3]}, {a: [1, 2, 3]});
|
|
assertDoesNotMatch({a: [1, 2, 3]}, {a: [1, 2]});
|
|
|
|
assertMatches({a: [1, 2, 3]}, {a: {$gt: MinKey}});
|
|
assertMatches({a: []}, {a: {$gt: MinKey}});
|
|
|
|
assertMatches({a: [1, 2, 3]}, {a: {$lt: MaxKey}});
|
|
assertMatches({a: []}, {a: {$lt: MaxKey}});
|
|
}()); |