summaryrefslogtreecommitdiff
path: root/jstests/aggregation/bugs/server11675.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/aggregation/bugs/server11675.js')
-rw-r--r--jstests/aggregation/bugs/server11675.js168
1 files changed, 90 insertions, 78 deletions
diff --git a/jstests/aggregation/bugs/server11675.js b/jstests/aggregation/bugs/server11675.js
index 513714f98d7..709120c27ca 100644
--- a/jstests/aggregation/bugs/server11675.js
+++ b/jstests/aggregation/bugs/server11675.js
@@ -5,8 +5,8 @@ var server11675 = function() {
var t = db.server11675;
t.drop();
- if (typeof(RUNNING_IN_SHARDED_AGG_TEST) != 'undefined') { // see end of testshard1.js
- db.adminCommand( { shardcollection : t.getFullName(), key : { "_id" : 1 } } );
+ if (typeof(RUNNING_IN_SHARDED_AGG_TEST) != 'undefined') { // see end of testshard1.js
+ db.adminCommand({shardcollection: t.getFullName(), key: {"_id": 1}});
}
t.insert({_id: 1, text: "apple", words: 1});
@@ -22,7 +22,7 @@ var server11675 = function() {
var pipeline = [{$match: query.query}];
if ('project' in query) {
- cursor = t.find(query.query, query.project); // no way to add to constructed cursor
+ cursor = t.find(query.query, query.project); // no way to add to constructed cursor
pipeline.push({$project: query.project});
}
@@ -46,89 +46,99 @@ var server11675 = function() {
assert.docEq(aggRes, findRes);
};
- assertSameAsFind({query: {}}); // sanity check
- assertSameAsFind({query: {$text:{$search:"apple"}}});
- assertSameAsFind({query: {$and:[{$text:{$search:"apple"}}, {_id:1}]}});
- assertSameAsFind({query: {$text:{$search:"apple"}}
- ,project: {_id:1, score: {$meta: "textScore"}}
- });
- assertSameAsFind({query: {$text:{$search:"apple banana"}}
- ,project: {_id:1, score: {$meta: "textScore"}}
- });
- assertSameAsFind({query: {$text:{$search:"apple banana"}}
- ,project: {_id:1, score: {$meta: "textScore"}}
- ,sort: {score: {$meta: "textScore"}}
- });
- assertSameAsFind({query: {$text:{$search:"apple banana"}}
- ,project: {_id:1, score: {$meta: "textScore"}}
- ,sort: {score: {$meta: "textScore"}}
- ,limit: 1
- });
- assertSameAsFind({query: {$text:{$search:"apple banana"}}
- ,project: {_id:1, score: {$meta: "textScore"}}
- ,sort: {score: {$meta: "textScore"}}
- ,skip: 1
- });
- assertSameAsFind({query: {$text:{$search:"apple banana"}}
- ,project: {_id:1, score: {$meta: "textScore"}}
- ,sort: {score: {$meta: "textScore"}}
- ,skip: 1
- ,limit: 1
- });
+ assertSameAsFind({query: {}}); // sanity check
+ assertSameAsFind({query: {$text: {$search: "apple"}}});
+ assertSameAsFind({query: {$and: [{$text: {$search: "apple"}}, {_id: 1}]}});
+ assertSameAsFind(
+ {query: {$text: {$search: "apple"}}, project: {_id: 1, score: {$meta: "textScore"}}});
+ assertSameAsFind({
+ query: {$text: {$search: "apple banana"}},
+ project: {_id: 1, score: {$meta: "textScore"}}
+ });
+ assertSameAsFind({
+ query: {$text: {$search: "apple banana"}},
+ project: {_id: 1, score: {$meta: "textScore"}},
+ sort: {score: {$meta: "textScore"}}
+ });
+ assertSameAsFind({
+ query: {$text: {$search: "apple banana"}},
+ project: {_id: 1, score: {$meta: "textScore"}},
+ sort: {score: {$meta: "textScore"}},
+ limit: 1
+ });
+ assertSameAsFind({
+ query: {$text: {$search: "apple banana"}},
+ project: {_id: 1, score: {$meta: "textScore"}},
+ sort: {score: {$meta: "textScore"}},
+ skip: 1
+ });
+ assertSameAsFind({
+ query: {$text: {$search: "apple banana"}},
+ project: {_id: 1, score: {$meta: "textScore"}},
+ sort: {score: {$meta: "textScore"}},
+ skip: 1,
+ limit: 1
+ });
// sharded find requires projecting the score to sort, but sharded agg does not.
var findRes = t.find({$text: {$search: "apple banana"}}, {textScore: {$meta: 'textScore'}})
- .sort({textScore: {$meta: 'textScore'}})
- .map(function(obj) {
- delete obj.textScore; // remove it to match agg output
- return obj;
- });
- var res = t.aggregate([{$match: {$text: {$search: 'apple banana'}}}
- ,{$sort: {textScore: {$meta: 'textScore'}}}
- ]).toArray();
+ .sort({textScore: {$meta: 'textScore'}})
+ .map(function(obj) {
+ delete obj.textScore; // remove it to match agg output
+ return obj;
+ });
+ var res = t.aggregate([
+ {$match: {$text: {$search: 'apple banana'}}},
+ {$sort: {textScore: {$meta: 'textScore'}}}
+ ]).toArray();
assert.eq(res, findRes);
// Make sure {$meta: 'textScore'} can be used as a sub-expression
- var res = t.aggregate([{$match: {_id:1, $text: {$search: 'apple'}}}
- ,{$project: {words: 1
- ,score: {$meta: 'textScore'}
- ,wordsTimesScore: {$multiply: ['$words', {$meta:'textScore'}]}
- }}
- ]).toArray();
+ var res = t.aggregate([
+ {$match: {_id: 1, $text: {$search: 'apple'}}},
+ {
+ $project: {
+ words: 1,
+ score: {$meta: 'textScore'},
+ wordsTimesScore: {$multiply: ['$words', {$meta: 'textScore'}]}
+ }
+ }
+ ]).toArray();
assert.eq(res[0].wordsTimesScore, res[0].words * res[0].score, tojson(res));
// And can be used in $group
- var res = t.aggregate([{$match: {_id: 1, $text: {$search: 'apple banana'}}}
- ,{$group: {_id: {$meta: 'textScore'}
- ,score: {$first: {$meta: 'textScore'}}
- }}
- ]).toArray();
+ var res = t.aggregate([
+ {$match: {_id: 1, $text: {$search: 'apple banana'}}},
+ {$group: {_id: {$meta: 'textScore'}, score: {$first: {$meta: 'textScore'}}}}
+ ]).toArray();
assert.eq(res[0]._id, res[0].score, tojson(res));
// Make sure metadata crosses shard -> merger boundary
- var res = t.aggregate([{$match: {_id:1, $text: {$search: 'apple'}}}
- ,{$project: {scoreOnShard: {$meta: 'textScore'} }}
- ,{$limit:1} // force a split. later stages run on merger
- ,{$project: {scoreOnShard:1
- ,scoreOnMerger: {$meta: 'textScore'} }}
- ]).toArray();
+ var res = t.aggregate([
+ {$match: {_id: 1, $text: {$search: 'apple'}}},
+ {$project: {scoreOnShard: {$meta: 'textScore'}}},
+ {$limit: 1} // force a split. later stages run on merger
+ ,
+ {$project: {scoreOnShard: 1, scoreOnMerger: {$meta: 'textScore'}}}
+ ]).toArray();
assert.eq(res[0].scoreOnMerger, res[0].scoreOnShard);
- var score = res[0].scoreOnMerger; // save for later tests
+ var score = res[0].scoreOnMerger; // save for later tests
// Make sure metadata crosses shard -> merger boundary even if not used on shard
- var res = t.aggregate([{$match: {_id:1, $text: {$search: 'apple'}}}
- ,{$limit:1} // force a split. later stages run on merger
- ,{$project: {scoreOnShard:1
- ,scoreOnMerger: {$meta: 'textScore'} }}
- ]).toArray();
+ var res = t.aggregate([
+ {$match: {_id: 1, $text: {$search: 'apple'}}},
+ {$limit: 1} // force a split. later stages run on merger
+ ,
+ {$project: {scoreOnShard: 1, scoreOnMerger: {$meta: 'textScore'}}}
+ ]).toArray();
assert.eq(res[0].scoreOnMerger, score);
// Make sure metadata works if first $project doesn't use it.
- var res = t.aggregate([{$match: {_id:1, $text: {$search: 'apple'}}}
- ,{$project: {_id:1}}
- ,{$project: {_id:1
- ,score: {$meta: 'textScore'} }}
- ]).toArray();
+ var res = t.aggregate([
+ {$match: {_id: 1, $text: {$search: 'apple'}}},
+ {$project: {_id: 1}},
+ {$project: {_id: 1, score: {$meta: 'textScore'}}}
+ ]).toArray();
assert.eq(res[0].score, score);
// Make sure the metadata is 'missing()' when it doesn't exist because it was never created
@@ -136,24 +146,26 @@ var server11675 = function() {
assert(!("score" in res[0]));
// Make sure the metadata is 'missing()' when it doesn't exist because the document changed
- var res = t.aggregate([{$match: {_id: 1, $text: {$search: 'apple banana'}}},
- {$group: {_id: 1, score: {$first: {$meta: 'textScore'}}}},
- {$project: {_id: 1, scoreAgain: {$meta: 'textScore'}}},
- ]).toArray();
+ var res = t.aggregate([
+ {$match: {_id: 1, $text: {$search: 'apple banana'}}},
+ {$group: {_id: 1, score: {$first: {$meta: 'textScore'}}}},
+ {$project: {_id: 1, scoreAgain: {$meta: 'textScore'}}},
+ ]).toArray();
assert(!("scoreAgain" in res[0]));
// Make sure metadata works after a $unwind
t.insert({_id: 5, text: 'mango', words: [1, 2, 3]});
- var res = t.aggregate([{$match: {$text: {$search: 'mango'}}},
- {$project: {score: {$meta: "textScore"}, _id:1, words: 1}},
- {$unwind: '$words'},
- {$project: {scoreAgain: {$meta: "textScore"}, score: 1}}
- ]).toArray();
+ var res = t.aggregate([
+ {$match: {$text: {$search: 'mango'}}},
+ {$project: {score: {$meta: "textScore"}, _id: 1, words: 1}},
+ {$unwind: '$words'},
+ {$project: {scoreAgain: {$meta: "textScore"}, score: 1}}
+ ]).toArray();
assert.eq(res[0].scoreAgain, res[0].score);
// Error checking
// $match, but wrong position
- assertErrorCode(t, [{$sort: {text: 1}} ,{$match: {$text: {$search: 'apple banana'}}}], 17313);
+ assertErrorCode(t, [{$sort: {text: 1}}, {$match: {$text: {$search: 'apple banana'}}}], 17313);
// wrong $stage, but correct position
assertErrorCode(t, [{$project: {searchValue: {$text: {$search: 'apple banana'}}}}], 15999);