diff options
author | Jason Rassi <rassi@10gen.com> | 2013-12-17 16:35:56 -0500 |
---|---|---|
committer | Jason Rassi <rassi@10gen.com> | 2013-12-17 16:46:33 -0500 |
commit | b44edc42e42524d2f8bf66d389eeb6d973fbf40e (patch) | |
tree | 507b0766c6905e2460072c247966ef1b64a6d753 /jstests/sharding/fts_score_sort_sharded.js | |
parent | 3050f432fe144a16516f7de0a346c0586f650ac6 (diff) | |
download | mongo-b44edc42e42524d2f8bf66d389eeb6d973fbf40e.tar.gz |
SERVER-9063 Correctly sort on text metadata for sharded queries
Diffstat (limited to 'jstests/sharding/fts_score_sort_sharded.js')
-rw-r--r-- | jstests/sharding/fts_score_sort_sharded.js | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/jstests/sharding/fts_score_sort_sharded.js b/jstests/sharding/fts_score_sort_sharded.js new file mode 100644 index 00000000000..3136401be1c --- /dev/null +++ b/jstests/sharding/fts_score_sort_sharded.js @@ -0,0 +1,68 @@ +// Test that queries with a sort on text metadata return results in the correct order in a sharded +// collection. + +var st = new ShardingTest({shards: 2}); +st.stopBalancer(); +var mongos = st.s0; +var shards = [st.shard0, st.shard1]; +var coll = mongos.getCollection("foo.bar"); +var admin = mongos.getDB("admin"); +var cursor; + +// +// Pre-split collection: shard 0 takes {_id: {$lt: 0}}, shard 1 takes {_id: {$gte: 0}}. +// +assert.commandWorked(admin.runCommand({enableSharding: coll.getDB().getName()})); +assert.commandWorked(admin.runCommand({movePrimary: coll.getDB().getName(), + to: "shard0000"})); +assert.commandWorked(admin.runCommand({shardCollection: coll.getFullName(), + key: {_id: 1}})); +assert.commandWorked(admin.runCommand({split: coll.getFullName(), middle: {_id: 0}})); +assert.commandWorked(admin.runCommand({moveChunk: coll.getFullName(), + find: {_id: 0}, + to: "shard0001"})); + +// +// Insert documents into collection and create text index. +// +coll.insert({_id: 1, a: "pizza"}); +coll.insert({_id: -1, a: "pizza pizza"}); +coll.insert({_id: 2, a: "pizza pizza pizza"}); +coll.insert({_id: -2, a: "pizza pizza pizza pizza"}); +assert.gleSuccess(coll.getDB()); +coll.ensureIndex({a: "text"}); +assert.gleSuccess(coll.getDB()); + +// +// Execute query with sort on document score, verify results are in correct order. +// +var results = coll.find({$text: {$search: "pizza"}}, + {s: {$meta: "textScore"}}).sort({s: {$meta: "textScore"}}).toArray(); +assert.eq(results.length, 4); +assert.eq(results[0]._id, -2); +assert.eq(results[1]._id, 2); +assert.eq(results[2]._id, -1); +assert.eq(results[3]._id, 1); + +// +// Verify that mongos requires the text metadata sort to be specified in the projection. +// + +// Projection not specified at all. +cursor = coll.find({$text: {$search: "pizza"}}).sort({s: {$meta: "textScore"}}); +assert.throws(function() { cursor.next(); }); + +// Projection specified with incorrect field name. +cursor = coll.find({$text: {$search: "pizza"}}, + {t: {$meta: "textScore"}}).sort({s: {$meta: "textScore"}}); +assert.throws(function() { cursor.next(); }); + +// Projection specified on correct field but with wrong sort. +cursor = coll.find({$text: {$search: "pizza"}}, {s: 1}).sort({s: {$meta: "textScore"}}); +assert.throws(function() { cursor.next(); }); +cursor = coll.find({$text: {$search: "pizza"}}, {s: -1}).sort({s: {$meta: "textScore"}}); +assert.throws(function() { cursor.next(); }); + +// TODO Test sort on compound key. + +st.stop(); |