diff options
Diffstat (limited to 'jstests/sharding/find_getmore_cmd.js')
-rw-r--r-- | jstests/sharding/find_getmore_cmd.js | 318 |
1 files changed, 159 insertions, 159 deletions
diff --git a/jstests/sharding/find_getmore_cmd.js b/jstests/sharding/find_getmore_cmd.js index e688fc0f9ca..d711c7cda53 100644 --- a/jstests/sharding/find_getmore_cmd.js +++ b/jstests/sharding/find_getmore_cmd.js @@ -2,163 +2,163 @@ * Test issuing raw find and getMore commands to mongos using db.runCommand(). */ (function() { - "use strict"; - - var cmdRes; - var cursorId; - - var st = new ShardingTest({shards: 2}); - st.stopBalancer(); - - // Set up a collection sharded by "_id" with one chunk on each of the two shards. - var db = st.s.getDB("test"); - var coll = db.getCollection("find_getmore_cmd"); - - coll.drop(); - assert.writeOK(coll.insert({_id: -9, a: 4, b: "foo foo"})); - assert.writeOK(coll.insert({_id: -5, a: 8})); - assert.writeOK(coll.insert({_id: -1, a: 10, b: "foo"})); - assert.writeOK(coll.insert({_id: 1, a: 5})); - assert.writeOK(coll.insert({_id: 5, a: 20, b: "foo foo foo"})); - assert.writeOK(coll.insert({_id: 9, a: 3})); - - assert.commandWorked(coll.ensureIndex({b: "text"})); - - assert.commandWorked(db.adminCommand({enableSharding: db.getName()})); - st.ensurePrimaryShard(db.getName(), st.shard0.shardName); - db.adminCommand({shardCollection: coll.getFullName(), key: {_id: 1}}); - assert.commandWorked(db.adminCommand({split: coll.getFullName(), middle: {_id: 0}})); - assert.commandWorked( - db.adminCommand({moveChunk: coll.getFullName(), find: {_id: 1}, to: st.shard1.shardName})); - - // Find with no options. - cmdRes = db.runCommand({find: coll.getName()}); - assert.commandWorked(cmdRes); - assert.eq(cmdRes.cursor.id, NumberLong(0)); - assert.eq(cmdRes.cursor.ns, coll.getFullName()); - assert.eq(cmdRes.cursor.firstBatch.length, 6); - - // Find with batchSize greater than the number of docs residing on each shard. This means that a - // getMore is required between mongos and the shell, but no getMores are issued between mongos - // and mongod. - cmdRes = db.runCommand({find: coll.getName(), batchSize: 4}); - assert.commandWorked(cmdRes); - assert.gt(cmdRes.cursor.id, NumberLong(0)); - assert.eq(cmdRes.cursor.ns, coll.getFullName()); - assert.eq(cmdRes.cursor.firstBatch.length, 4); - cmdRes = db.runCommand({getMore: cmdRes.cursor.id, collection: coll.getName()}); - assert.commandWorked(cmdRes); - assert.eq(cmdRes.cursor.id, NumberLong(0)); - assert.eq(cmdRes.cursor.ns, coll.getFullName()); - assert.eq(cmdRes.cursor.nextBatch.length, 2); - - // Find with batchSize less than the number of docs residing on each shard. This time getMores - // will be issued between mongos and mongod. - cmdRes = db.runCommand({find: coll.getName(), batchSize: 2}); - assert.commandWorked(cmdRes); - assert.gt(cmdRes.cursor.id, NumberLong(0)); - assert.eq(cmdRes.cursor.ns, coll.getFullName()); - assert.eq(cmdRes.cursor.firstBatch.length, 2); - cursorId = cmdRes.cursor.id; - cmdRes = db.runCommand({getMore: cursorId, collection: coll.getName(), batchSize: 2}); - assert.commandWorked(cmdRes); - assert.eq(cmdRes.cursor.id, cursorId); - assert.eq(cmdRes.cursor.ns, coll.getFullName()); - assert.eq(cmdRes.cursor.nextBatch.length, 2); - cmdRes = db.runCommand({getMore: cursorId, collection: coll.getName()}); - assert.eq(cmdRes.cursor.id, NumberLong(0)); - assert.eq(cmdRes.cursor.ns, coll.getFullName()); - assert.eq(cmdRes.cursor.nextBatch.length, 2); - - // Combine skip, limit, and sort. - cmdRes = db.runCommand({find: coll.getName(), skip: 4, limit: 1, sort: {_id: -1}}); - assert.commandWorked(cmdRes); - assert.eq(cmdRes.cursor.id, NumberLong(0)); - assert.eq(cmdRes.cursor.ns, coll.getFullName()); - assert.eq(cmdRes.cursor.firstBatch.length, 1); - assert.eq(cmdRes.cursor.firstBatch[0], {_id: -5, a: 8}); - - // Find where adding limit/ntoreturn and skip overflows. - var largeInt = new NumberLong('9223372036854775807'); - cmdRes = db.runCommand({find: coll.getName(), skip: largeInt, limit: largeInt}); - assert.commandFailed(cmdRes); - cmdRes = db.runCommand({find: coll.getName(), skip: largeInt, ntoreturn: largeInt}); - assert.commandFailed(cmdRes); - cmdRes = db.runCommand( - {find: coll.getName(), skip: largeInt, ntoreturn: largeInt, singleBatch: true}); - assert.commandFailed(cmdRes); - - // A predicate with $where. - cmdRes = db.runCommand({find: coll.getName(), filter: {$where: "this._id == 5"}}); - assert.commandWorked(cmdRes); - assert.eq(cmdRes.cursor.id, NumberLong(0)); - assert.eq(cmdRes.cursor.ns, coll.getFullName()); - assert.eq(cmdRes.cursor.firstBatch.length, 1); - assert.eq(cmdRes.cursor.firstBatch[0], {_id: 5, a: 20, b: "foo foo foo"}); - - // Tailable option should result in a failure because the collection is not capped. - cmdRes = db.runCommand({find: coll.getName(), tailable: true}); - assert.commandFailed(cmdRes); - - // $natural sort. - cmdRes = db.runCommand({find: coll.getName(), sort: {$natural: 1}}); - assert.commandWorked(cmdRes); - assert.eq(cmdRes.cursor.id, NumberLong(0)); - assert.eq(cmdRes.cursor.ns, coll.getFullName()); - assert.eq(cmdRes.cursor.firstBatch.length, 6); - - // Should be able to sort despite projecting out the sort key. - cmdRes = db.runCommand({find: coll.getName(), sort: {a: 1}, projection: {_id: 1}}); - assert.commandWorked(cmdRes); - assert.eq(cmdRes.cursor.id, NumberLong(0)); - assert.eq(cmdRes.cursor.ns, coll.getFullName()); - assert.eq(cmdRes.cursor.firstBatch.length, 6); - assert.eq(cmdRes.cursor.firstBatch[0], {_id: 9}); - assert.eq(cmdRes.cursor.firstBatch[1], {_id: -9}); - assert.eq(cmdRes.cursor.firstBatch[2], {_id: 1}); - assert.eq(cmdRes.cursor.firstBatch[3], {_id: -5}); - assert.eq(cmdRes.cursor.firstBatch[4], {_id: -1}); - assert.eq(cmdRes.cursor.firstBatch[5], {_id: 5}); - - // Ensure textScore meta-sort works in mongos. - cmdRes = db.runCommand({ - find: coll.getName(), - filter: {$text: {$search: "foo"}}, - sort: {score: {$meta: "textScore"}}, - projection: {score: {$meta: "textScore"}} - }); - assert.commandWorked(cmdRes); - assert.eq(cmdRes.cursor.id, NumberLong(0)); - assert.eq(cmdRes.cursor.ns, coll.getFullName()); - assert.eq(cmdRes.cursor.firstBatch.length, 3); - assert.eq(cmdRes.cursor.firstBatch[0]["_id"], 5); - assert.eq(cmdRes.cursor.firstBatch[1]["_id"], -9); - assert.eq(cmdRes.cursor.firstBatch[2]["_id"], -1); - - // User projection on $sortKey is illegal. - cmdRes = db.runCommand({find: coll.getName(), projection: {$sortKey: 1}, sort: {_id: 1}}); - assert.commandFailed(cmdRes); - cmdRes = db.runCommand( - {find: coll.getName(), projection: {$sortKey: {$meta: 'sortKey'}}, sort: {_id: 1}}); - assert.commandFailed(cmdRes); - - // User should be able to issue a sortKey meta-projection, as long as it's not on the reserved - // $sortKey field. - cmdRes = db.runCommand({ - find: coll.getName(), - projection: {_id: 0, a: 0, b: 0, key: {$meta: 'sortKey'}}, - sort: {_id: 1} - }); - assert.commandWorked(cmdRes); - assert.eq(cmdRes.cursor.id, NumberLong(0)); - assert.eq(cmdRes.cursor.ns, coll.getFullName()); - assert.eq(cmdRes.cursor.firstBatch.length, 6); - assert.eq(cmdRes.cursor.firstBatch[0], {key: {"": -9}}); - assert.eq(cmdRes.cursor.firstBatch[1], {key: {"": -5}}); - assert.eq(cmdRes.cursor.firstBatch[2], {key: {"": -1}}); - assert.eq(cmdRes.cursor.firstBatch[3], {key: {"": 1}}); - assert.eq(cmdRes.cursor.firstBatch[4], {key: {"": 5}}); - assert.eq(cmdRes.cursor.firstBatch[5], {key: {"": 9}}); - - st.stop(); +"use strict"; + +var cmdRes; +var cursorId; + +var st = new ShardingTest({shards: 2}); +st.stopBalancer(); + +// Set up a collection sharded by "_id" with one chunk on each of the two shards. +var db = st.s.getDB("test"); +var coll = db.getCollection("find_getmore_cmd"); + +coll.drop(); +assert.writeOK(coll.insert({_id: -9, a: 4, b: "foo foo"})); +assert.writeOK(coll.insert({_id: -5, a: 8})); +assert.writeOK(coll.insert({_id: -1, a: 10, b: "foo"})); +assert.writeOK(coll.insert({_id: 1, a: 5})); +assert.writeOK(coll.insert({_id: 5, a: 20, b: "foo foo foo"})); +assert.writeOK(coll.insert({_id: 9, a: 3})); + +assert.commandWorked(coll.ensureIndex({b: "text"})); + +assert.commandWorked(db.adminCommand({enableSharding: db.getName()})); +st.ensurePrimaryShard(db.getName(), st.shard0.shardName); +db.adminCommand({shardCollection: coll.getFullName(), key: {_id: 1}}); +assert.commandWorked(db.adminCommand({split: coll.getFullName(), middle: {_id: 0}})); +assert.commandWorked( + db.adminCommand({moveChunk: coll.getFullName(), find: {_id: 1}, to: st.shard1.shardName})); + +// Find with no options. +cmdRes = db.runCommand({find: coll.getName()}); +assert.commandWorked(cmdRes); +assert.eq(cmdRes.cursor.id, NumberLong(0)); +assert.eq(cmdRes.cursor.ns, coll.getFullName()); +assert.eq(cmdRes.cursor.firstBatch.length, 6); + +// Find with batchSize greater than the number of docs residing on each shard. This means that a +// getMore is required between mongos and the shell, but no getMores are issued between mongos +// and mongod. +cmdRes = db.runCommand({find: coll.getName(), batchSize: 4}); +assert.commandWorked(cmdRes); +assert.gt(cmdRes.cursor.id, NumberLong(0)); +assert.eq(cmdRes.cursor.ns, coll.getFullName()); +assert.eq(cmdRes.cursor.firstBatch.length, 4); +cmdRes = db.runCommand({getMore: cmdRes.cursor.id, collection: coll.getName()}); +assert.commandWorked(cmdRes); +assert.eq(cmdRes.cursor.id, NumberLong(0)); +assert.eq(cmdRes.cursor.ns, coll.getFullName()); +assert.eq(cmdRes.cursor.nextBatch.length, 2); + +// Find with batchSize less than the number of docs residing on each shard. This time getMores +// will be issued between mongos and mongod. +cmdRes = db.runCommand({find: coll.getName(), batchSize: 2}); +assert.commandWorked(cmdRes); +assert.gt(cmdRes.cursor.id, NumberLong(0)); +assert.eq(cmdRes.cursor.ns, coll.getFullName()); +assert.eq(cmdRes.cursor.firstBatch.length, 2); +cursorId = cmdRes.cursor.id; +cmdRes = db.runCommand({getMore: cursorId, collection: coll.getName(), batchSize: 2}); +assert.commandWorked(cmdRes); +assert.eq(cmdRes.cursor.id, cursorId); +assert.eq(cmdRes.cursor.ns, coll.getFullName()); +assert.eq(cmdRes.cursor.nextBatch.length, 2); +cmdRes = db.runCommand({getMore: cursorId, collection: coll.getName()}); +assert.eq(cmdRes.cursor.id, NumberLong(0)); +assert.eq(cmdRes.cursor.ns, coll.getFullName()); +assert.eq(cmdRes.cursor.nextBatch.length, 2); + +// Combine skip, limit, and sort. +cmdRes = db.runCommand({find: coll.getName(), skip: 4, limit: 1, sort: {_id: -1}}); +assert.commandWorked(cmdRes); +assert.eq(cmdRes.cursor.id, NumberLong(0)); +assert.eq(cmdRes.cursor.ns, coll.getFullName()); +assert.eq(cmdRes.cursor.firstBatch.length, 1); +assert.eq(cmdRes.cursor.firstBatch[0], {_id: -5, a: 8}); + +// Find where adding limit/ntoreturn and skip overflows. +var largeInt = new NumberLong('9223372036854775807'); +cmdRes = db.runCommand({find: coll.getName(), skip: largeInt, limit: largeInt}); +assert.commandFailed(cmdRes); +cmdRes = db.runCommand({find: coll.getName(), skip: largeInt, ntoreturn: largeInt}); +assert.commandFailed(cmdRes); +cmdRes = + db.runCommand({find: coll.getName(), skip: largeInt, ntoreturn: largeInt, singleBatch: true}); +assert.commandFailed(cmdRes); + +// A predicate with $where. +cmdRes = db.runCommand({find: coll.getName(), filter: {$where: "this._id == 5"}}); +assert.commandWorked(cmdRes); +assert.eq(cmdRes.cursor.id, NumberLong(0)); +assert.eq(cmdRes.cursor.ns, coll.getFullName()); +assert.eq(cmdRes.cursor.firstBatch.length, 1); +assert.eq(cmdRes.cursor.firstBatch[0], {_id: 5, a: 20, b: "foo foo foo"}); + +// Tailable option should result in a failure because the collection is not capped. +cmdRes = db.runCommand({find: coll.getName(), tailable: true}); +assert.commandFailed(cmdRes); + +// $natural sort. +cmdRes = db.runCommand({find: coll.getName(), sort: {$natural: 1}}); +assert.commandWorked(cmdRes); +assert.eq(cmdRes.cursor.id, NumberLong(0)); +assert.eq(cmdRes.cursor.ns, coll.getFullName()); +assert.eq(cmdRes.cursor.firstBatch.length, 6); + +// Should be able to sort despite projecting out the sort key. +cmdRes = db.runCommand({find: coll.getName(), sort: {a: 1}, projection: {_id: 1}}); +assert.commandWorked(cmdRes); +assert.eq(cmdRes.cursor.id, NumberLong(0)); +assert.eq(cmdRes.cursor.ns, coll.getFullName()); +assert.eq(cmdRes.cursor.firstBatch.length, 6); +assert.eq(cmdRes.cursor.firstBatch[0], {_id: 9}); +assert.eq(cmdRes.cursor.firstBatch[1], {_id: -9}); +assert.eq(cmdRes.cursor.firstBatch[2], {_id: 1}); +assert.eq(cmdRes.cursor.firstBatch[3], {_id: -5}); +assert.eq(cmdRes.cursor.firstBatch[4], {_id: -1}); +assert.eq(cmdRes.cursor.firstBatch[5], {_id: 5}); + +// Ensure textScore meta-sort works in mongos. +cmdRes = db.runCommand({ + find: coll.getName(), + filter: {$text: {$search: "foo"}}, + sort: {score: {$meta: "textScore"}}, + projection: {score: {$meta: "textScore"}} +}); +assert.commandWorked(cmdRes); +assert.eq(cmdRes.cursor.id, NumberLong(0)); +assert.eq(cmdRes.cursor.ns, coll.getFullName()); +assert.eq(cmdRes.cursor.firstBatch.length, 3); +assert.eq(cmdRes.cursor.firstBatch[0]["_id"], 5); +assert.eq(cmdRes.cursor.firstBatch[1]["_id"], -9); +assert.eq(cmdRes.cursor.firstBatch[2]["_id"], -1); + +// User projection on $sortKey is illegal. +cmdRes = db.runCommand({find: coll.getName(), projection: {$sortKey: 1}, sort: {_id: 1}}); +assert.commandFailed(cmdRes); +cmdRes = db.runCommand( + {find: coll.getName(), projection: {$sortKey: {$meta: 'sortKey'}}, sort: {_id: 1}}); +assert.commandFailed(cmdRes); + +// User should be able to issue a sortKey meta-projection, as long as it's not on the reserved +// $sortKey field. +cmdRes = db.runCommand({ + find: coll.getName(), + projection: {_id: 0, a: 0, b: 0, key: {$meta: 'sortKey'}}, + sort: {_id: 1} +}); +assert.commandWorked(cmdRes); +assert.eq(cmdRes.cursor.id, NumberLong(0)); +assert.eq(cmdRes.cursor.ns, coll.getFullName()); +assert.eq(cmdRes.cursor.firstBatch.length, 6); +assert.eq(cmdRes.cursor.firstBatch[0], {key: {"": -9}}); +assert.eq(cmdRes.cursor.firstBatch[1], {key: {"": -5}}); +assert.eq(cmdRes.cursor.firstBatch[2], {key: {"": -1}}); +assert.eq(cmdRes.cursor.firstBatch[3], {key: {"": 1}}); +assert.eq(cmdRes.cursor.firstBatch[4], {key: {"": 5}}); +assert.eq(cmdRes.cursor.firstBatch[5], {key: {"": 9}}); + +st.stop(); })(); |