summaryrefslogtreecommitdiff
path: root/jstests
diff options
context:
space:
mode:
authorDavid Hatch <david.hatch@mongodb.com>2016-07-01 15:34:05 -0400
committerDavid Hatch <david.hatch@mongodb.com>2016-07-06 16:43:48 -0400
commitc8c1ea166e7d15cc354dc87c3e4ec76cc9f3839b (patch)
tree016243f6075f9501e572490b272820412b4b2c23 /jstests
parent8b91e7b1ad7ccff87b61afdecba864d15007db50 (diff)
downloadmongo-c8c1ea166e7d15cc354dc87c3e4ec76cc9f3839b.tar.gz
SERVER-24404 Make $push, $pullAll, and $pull respect collation.
Diffstat (limited to 'jstests')
-rw-r--r--jstests/core/collation_update.js137
1 files changed, 137 insertions, 0 deletions
diff --git a/jstests/core/collation_update.js b/jstests/core/collation_update.js
index 1fc3901ccf5..d016214cf5b 100644
--- a/jstests/core/collation_update.js
+++ b/jstests/core/collation_update.js
@@ -85,4 +85,141 @@
assert.writeOK(coll.update({}, {$addToSet: {a: "FOO"}}));
var set = coll.findOne().a;
assert.eq(set.length, 1);
+
+ // $pull respects query collation.
+ if (db.getMongo().writeMode() === "commands") {
+ coll.drop();
+
+ // "foo" != "FOO" (case-sensitive), so it is not pulled.
+ assert.writeOK(coll.insert({a: ["foo", "FOO"]}));
+ assert.writeOK(coll.update({}, {$pull: {a: "foo"}}, caseSensitive));
+ var arr = coll.findOne().a;
+ assert.eq(arr.length, 1);
+ assert(arr.includes("FOO"));
+
+ // "foo" == "FOO" (case-insensitive), so "FOO" is pulled.
+ assert.writeOK(coll.update({}, {$pull: {a: "foo"}}, caseInsensitive));
+ arr = coll.findOne().a;
+ assert.eq(arr.length, 0);
+
+ // collation-aware $pull removes all instances that match.
+ coll.drop();
+ assert.writeOK(coll.insert({a: ["foo", "FOO"]}));
+ assert.writeOK(coll.update({}, {$pull: {a: "foo"}}, caseInsensitive));
+ arr = coll.findOne().a;
+ assert.eq(arr.length, 0);
+
+ // collation-aware $pull with comparisons removes matching instances.
+ coll.drop();
+
+ // "124" > "1234" (case-sensitive), so it is not removed.
+ assert.writeOK(coll.insert({a: ["124", "1234"]}));
+ assert.writeOK(coll.update({}, {$pull: {a: {$lt: "1234"}}}, caseSensitive));
+ arr = coll.findOne().a;
+ assert.eq(arr.length, 2);
+
+ // 124 < 1234 (numeric ordering), so it is removed.
+ assert.writeOK(coll.update({}, {$pull: {a: {$lt: "1234"}}}, numericOrdering));
+ arr = coll.findOne().a;
+ assert.eq(arr.length, 1);
+ assert(arr.includes("1234"));
+ }
+
+ // $pull respects collection default collation.
+ coll.drop();
+ assert.commandWorked(db.createCollection(coll.getName(), caseInsensitive));
+ assert.writeOK(coll.insert({a: ["foo", "FOO"]}));
+ assert.writeOK(coll.update({}, {$pull: {a: "foo"}}));
+ var arr = coll.findOne().a;
+ assert.eq(arr.length, 0);
+
+ // $pullAll respects query collation.
+ if (db.getMongo().writeMode() === "commands") {
+ coll.drop();
+
+ // "foo" != "FOO" (case-sensitive), so no changes are made.
+ assert.writeOK(coll.insert({a: ["foo", "bar"]}));
+ assert.writeOK(coll.update({}, {$pullAll: {a: ["FOO", "BAR"]}}, caseSensitive));
+ var arr = coll.findOne().a;
+ assert.eq(arr.length, 2);
+
+ // "foo" == "FOO", "bar" == "BAR" (case-insensitive), so both are removed.
+ assert.writeOK(coll.update({}, {$pullAll: {a: ["FOO", "BAR"]}}, caseInsensitive));
+ arr = coll.findOne().a;
+ assert.eq(arr.length, 0);
+ }
+
+ // $pullAll respects collection default collation.
+ coll.drop();
+ assert.commandWorked(db.createCollection(coll.getName(), caseInsensitive));
+ assert.writeOK(coll.insert({a: ["foo", "bar"]}));
+ assert.writeOK(coll.update({}, {$pullAll: {a: ["FOO", "BAR"]}}));
+ var arr = coll.findOne().a;
+ assert.eq(arr.length, 0);
+
+ // $push with $sort respects query collation.
+ if (db.getMongo().writeMode() === "commands") {
+ coll.drop();
+
+ // "1230" < "1234" < "124" (case-sensitive)
+ assert.writeOK(coll.insert({a: ["1234", "124"]}));
+ assert.writeOK(coll.update({}, {$push: {a: {$each: ["1230"], $sort: 1}}}, caseSensitive));
+ var arr = coll.findOne().a;
+ assert.eq(arr.length, 3);
+ assert.eq(arr[0], "1230");
+ assert.eq(arr[1], "1234");
+ assert.eq(arr[2], "124");
+
+ // "124" < "1230" < "1234" (numeric ordering)
+ coll.drop();
+ assert.writeOK(coll.insert({a: ["1234", "124"]}));
+ assert.writeOK(coll.update({}, {$push: {a: {$each: ["1230"], $sort: 1}}}, numericOrdering));
+ arr = coll.findOne().a;
+ assert.eq(arr.length, 3);
+ assert.eq(arr[0], "124");
+ assert.eq(arr[1], "1230");
+ assert.eq(arr[2], "1234");
+ }
+
+ // $push with $sort respects collection default collation.
+ coll.drop();
+ assert.commandWorked(db.createCollection(coll.getName(), numericOrdering));
+ assert.writeOK(coll.insert({a: ["1234", "124"]}));
+ assert.writeOK(coll.update({}, {$push: {a: {$each: ["1230"], $sort: 1}}}));
+ var arr = coll.findOne().a;
+ assert.eq(arr.length, 3);
+ assert.eq(arr[0], "124");
+ assert.eq(arr[1], "1230");
+ assert.eq(arr[2], "1234");
+
+ // $ positional operator respects query collation on $set.
+ if (db.getMongo().writeMode() === "commands") {
+ coll.drop();
+
+ // "foo" != "FOO" (case-sensitive) so no update occurs.
+ assert.writeOK(coll.insert({a: ["foo", "FOO"]}));
+ assert.writeOK(coll.update({a: "FOO"}, {$set: {"a.$": "FOO"}}, caseSensitive));
+ var arr = coll.findOne().a;
+ assert.eq(arr.length, 2);
+ assert.eq(arr[0], "foo");
+ assert.eq(arr[1], "FOO");
+
+ // "foo" == "FOO" (case-insensitive) so no update occurs.
+ assert.writeOK(coll.insert({a: ["foo", "FOO"]}));
+ assert.writeOK(coll.update({a: "FOO"}, {$set: {"a.$": "FOO"}}, caseInsensitive));
+ var arr = coll.findOne().a;
+ assert.eq(arr.length, 2);
+ assert.eq(arr[0], "FOO");
+ assert.eq(arr[1], "FOO");
+ }
+
+ // $ positional operator respects collection default collation on $set.
+ coll.drop();
+ assert.commandWorked(db.createCollection(coll.getName(), caseInsensitive));
+ assert.writeOK(coll.insert({a: ["foo", "FOO"]}));
+ assert.writeOK(coll.update({a: "FOO"}, {$set: {"a.$": "FOO"}}));
+ var arr = coll.findOne().a;
+ assert.eq(arr.length, 2);
+ assert.eq(arr[0], "FOO");
+ assert.eq(arr[1], "FOO");
})();