| Steps To Reproduce: |
var colName = 'mycol';
|
var dbTest = db[colName];
|
var docSize = 10000;
|
|
function generateData(dbTest, docSize) {
|
while (docSize--) {
|
var doc = {
|
'item' : docSize,
|
'ratings' : generateRatings(20)
|
};
|
dbTest.insert(doc);
|
}
|
|
function generateRatings(maxRatings) {
|
var rSize = rand(maxRatings);
|
if (rSize) {
|
var ratings = [];
|
while (rSize--) {
|
ratings.push({
|
'revId': new ObjectId(),
|
'score': {
|
'q1': rand(6),
|
'q2': rand(15)
|
}
|
});
|
}
|
return ratings;
|
}
|
}
|
}
|
|
// return number from interval < 0 , topLimit-1 >
|
function rand(topLimit) {
|
return Math.floor(Math.random() * topLimit);
|
}
|
|
|
|
generateData(dbTest, docSize);
|
dbTest.createIndex({'ratings.score.q1':1, 'ratings.score.q2':1});
|
// TEST:
|
|
var q1 = 4;
|
var q2 = 9;
|
var query1 = { 'ratings' : { $elemMatch : { 'score.q1' : q1 , 'score.q2' : q2}}};
|
var query2 = { 'ratings.score' : { $elemMatch : { 'q1' : q1, 'q2' : q2}}};
|
|
dbTest.count(query1); // Use index only for 'ratings.score.q1'. Return X.
|
dbTest.count(query2); // Use index for q1 and q2. Index match X documents, but always return 0.
|
|
dbTest.explain({'executionStats':1}).count(query1);
|
dbTest.explain({'executionStats':1}).count(query2);
|
|
|
//> // TEST:
|
//>
|
//> var q1 = 4;
|
//> var q2 = 9;
|
//> var query1 = { 'ratings' : { $elemMatch : { 'score.q1' : q1 , 'score.q2' : q2}}};
|
//> var query2 = { 'ratings.score' : { $elemMatch : { 'q1' : q1, 'q2' : q2}}};
|
//>
|
//> dbTest.count(query1); // Use index only for 'ratings.score.q1'. Return X.
|
//981
|
//> dbTest.count(query2); // Use index for q1 and q2. Index match X documents, but always return 0.
|
//0
|
//>
|
//> dbTest.explain({'executionStats':1}).count(query1);
|
//{
|
// "queryPlanner" : {
|
// "plannerVersion" : 1,
|
// "namespace" : "ttt.mycol",
|
// "indexFilterSet" : false,
|
// "parsedQuery" : {
|
// "ratings" : {
|
// "$elemMatch" : {
|
// "$and" : [
|
// {
|
// "score.q1" : {
|
// "$eq" : 4
|
// }
|
// },
|
// {
|
// "score.q2" : {
|
// "$eq" : 9
|
// }
|
// }
|
// ]
|
// }
|
// }
|
// },
|
// "winningPlan" : {
|
// "stage" : "COUNT",
|
// "inputStage" : {
|
// "stage" : "KEEP_MUTATIONS",
|
// "inputStage" : {
|
// "stage" : "FETCH",
|
// "filter" : {
|
// "ratings" : {
|
// "$elemMatch" : {
|
// "$and" : [
|
// {
|
// "score.q1" : {
|
// "$eq" : 4
|
// }
|
// },
|
// {
|
// "score.q2" : {
|
// "$eq" : 9
|
// }
|
// }
|
// ]
|
// }
|
// }
|
// },
|
// "inputStage" : {
|
// "stage" : "IXSCAN",
|
// "keyPattern" : {
|
// "ratings.score.q1" : 1,
|
// "ratings.score.q2" : 1
|
// },
|
// "indexName" : "ratings.score.q1_1_ratings.score.q2_1",
|
// "isMultiKey" : true,
|
// "direction" : "forward",
|
// "indexBounds" : {
|
// "ratings.score.q1" : [
|
// "[4.0, 4.0]"
|
// ],
|
// "ratings.score.q2" : [
|
// "[MinKey, MaxKey]"
|
// ]
|
// }
|
// }
|
// }
|
// }
|
// },
|
// "rejectedPlans" : [ ]
|
// },
|
// "executionStats" : {
|
// "executionSuccess" : true,
|
// "nReturned" : 0,
|
// "executionTimeMillis" : 30,
|
// "totalKeysExamined" : 14919,
|
// "totalDocsExamined" : 7120,
|
// "executionStages" : {
|
// "stage" : "COUNT",
|
// "nReturned" : 0,
|
// "executionTimeMillisEstimate" : 30,
|
// "works" : 14920,
|
// "advanced" : 0,
|
// "needTime" : 14919,
|
// "needFetch" : 0,
|
// "saveState" : 116,
|
// "restoreState" : 116,
|
// "isEOF" : 1,
|
// "invalidates" : 0,
|
// "nCounted" : 981,
|
// "nSkipped" : 0,
|
// "inputStage" : {
|
// "stage" : "KEEP_MUTATIONS",
|
// "nReturned" : 981,
|
// "executionTimeMillisEstimate" : 30,
|
// "works" : 14920,
|
// "advanced" : 981,
|
// "needTime" : 13938,
|
// "needFetch" : 0,
|
// "saveState" : 116,
|
// "restoreState" : 116,
|
// "isEOF" : 1,
|
// "invalidates" : 0,
|
// "inputStage" : {
|
// "stage" : "FETCH",
|
// "filter" : {
|
// "ratings" : {
|
// "$elemMatch" : {
|
// "$and" : [
|
// {
|
// "score.q1" : {
|
// "$eq" : 4
|
// }
|
// },
|
// {
|
// "score.q2" : {
|
// "$eq" : 9
|
// }
|
// }
|
// ]
|
// }
|
// }
|
// },
|
// "nReturned" : 981,
|
// "executionTimeMillisEstimate" : 30,
|
// "works" : 14920,
|
// "advanced" : 981,
|
// "needTime" : 13938,
|
// "needFetch" : 0,
|
// "saveState" : 116,
|
// "restoreState" : 116,
|
// "isEOF" : 1,
|
// "invalidates" : 0,
|
// "docsExamined" : 7120,
|
// "alreadyHasObj" : 0,
|
// "inputStage" : {
|
// "stage" : "IXSCAN",
|
// "nReturned" : 7120,
|
// "executionTimeMillisEstimate" : 10,
|
// "works" : 14920,
|
// "advanced" : 7120,
|
// "needTime" : 7799,
|
// "needFetch" : 0,
|
// "saveState" : 116,
|
// "restoreState" : 116,
|
// "isEOF" : 1,
|
// "invalidates" : 0,
|
// "keyPattern" : {
|
// "ratings.score.q1" : 1,
|
// "ratings.score.q2" : 1
|
// },
|
// "indexName" : "ratings.score.q1_1_ratings.score.q2_1",
|
// "isMultiKey" : true,
|
// "direction" : "forward",
|
// "indexBounds" : {
|
// "ratings.score.q1" : [
|
// "[4.0, 4.0]"
|
// ],
|
// "ratings.score.q2" : [
|
// "[MinKey, MaxKey]"
|
// ]
|
// },
|
// "keysExamined" : 14919,
|
// "dupsTested" : 14919,
|
// "dupsDropped" : 7799,
|
// "seenInvalidated" : 0,
|
// "matchTested" : 0
|
// }
|
// }
|
// }
|
// },
|
// "allPlansExecution" : [ ]
|
// },
|
// "serverInfo" : {
|
// "host" : "durcakubupc",
|
// "port" : 27017,
|
// "version" : "3.0.12",
|
// "gitVersion" : "33934938e0e95d534cebbaff656cde916b9c3573"
|
// },
|
// "ok" : 1
|
//}
|
//> dbTest.explain({'executionStats':1}).count(query2);
|
//{
|
// "queryPlanner" : {
|
// "plannerVersion" : 1,
|
// "namespace" : "ttt.mycol",
|
// "indexFilterSet" : false,
|
// "parsedQuery" : {
|
// "ratings.score" : {
|
// "$elemMatch" : {
|
// "$and" : [
|
// {
|
// "q1" : {
|
// "$eq" : 4
|
// }
|
// },
|
// {
|
// "q2" : {
|
// "$eq" : 9
|
// }
|
// }
|
// ]
|
// }
|
// }
|
// },
|
// "winningPlan" : {
|
// "stage" : "COUNT",
|
// "inputStage" : {
|
// "stage" : "KEEP_MUTATIONS",
|
// "inputStage" : {
|
// "stage" : "FETCH",
|
// "filter" : {
|
// "ratings.score" : {
|
// "$elemMatch" : {
|
// "$and" : [
|
// {
|
// "q1" : {
|
// "$eq" : 4
|
// }
|
// },
|
// {
|
// "q2" : {
|
// "$eq" : 9
|
// }
|
// }
|
// ]
|
// }
|
// }
|
// },
|
// "inputStage" : {
|
// "stage" : "IXSCAN",
|
// "keyPattern" : {
|
// "ratings.score.q1" : 1,
|
// "ratings.score.q2" : 1
|
// },
|
// "indexName" : "ratings.score.q1_1_ratings.score.q2_1",
|
// "isMultiKey" : true,
|
// "direction" : "forward",
|
// "indexBounds" : {
|
// "ratings.score.q1" : [
|
// "[4.0, 4.0]"
|
// ],
|
// "ratings.score.q2" : [
|
// "[9.0, 9.0]"
|
// ]
|
// }
|
// }
|
// }
|
// }
|
// },
|
// "rejectedPlans" : [ ]
|
// },
|
// "executionStats" : {
|
// "executionSuccess" : true,
|
// "nReturned" : 0,
|
// "executionTimeMillis" : 3,
|
// "totalKeysExamined" : 981,
|
// "totalDocsExamined" : 981,
|
// "executionStages" : {
|
// "stage" : "COUNT",
|
// "nReturned" : 0,
|
// "executionTimeMillisEstimate" : 10,
|
// "works" : 982,
|
// "advanced" : 0,
|
// "needTime" : 981,
|
// "needFetch" : 0,
|
// "saveState" : 7,
|
// "restoreState" : 7,
|
// "isEOF" : 1,
|
// "invalidates" : 0,
|
// "nCounted" : 0,
|
// "nSkipped" : 0,
|
// "inputStage" : {
|
// "stage" : "KEEP_MUTATIONS",
|
// "nReturned" : 0,
|
// "executionTimeMillisEstimate" : 10,
|
// "works" : 982,
|
// "advanced" : 0,
|
// "needTime" : 981,
|
// "needFetch" : 0,
|
// "saveState" : 7,
|
// "restoreState" : 7,
|
// "isEOF" : 1,
|
// "invalidates" : 0,
|
// "inputStage" : {
|
// "stage" : "FETCH",
|
// "filter" : {
|
// "ratings.score" : {
|
// "$elemMatch" : {
|
// "$and" : [
|
// {
|
// "q1" : {
|
// "$eq" : 4
|
// }
|
// },
|
// {
|
// "q2" : {
|
// "$eq" : 9
|
// }
|
// }
|
// ]
|
// }
|
// }
|
// },
|
// "nReturned" : 0,
|
// "executionTimeMillisEstimate" : 10,
|
// "works" : 982,
|
// "advanced" : 0,
|
// "needTime" : 981,
|
// "needFetch" : 0,
|
// "saveState" : 7,
|
// "restoreState" : 7,
|
// "isEOF" : 1,
|
// "invalidates" : 0,
|
// "docsExamined" : 981,
|
// "alreadyHasObj" : 0,
|
// "inputStage" : {
|
// "stage" : "IXSCAN",
|
// "nReturned" : 981,
|
// "executionTimeMillisEstimate" : 0,
|
// "works" : 982,
|
// "advanced" : 981,
|
// "needTime" : 0,
|
// "needFetch" : 0,
|
// "saveState" : 7,
|
// "restoreState" : 7,
|
// "isEOF" : 1,
|
// "invalidates" : 0,
|
// "keyPattern" : {
|
// "ratings.score.q1" : 1,
|
// "ratings.score.q2" : 1
|
// },
|
// "indexName" : "ratings.score.q1_1_ratings.score.q2_1",
|
// "isMultiKey" : true,
|
// "direction" : "forward",
|
// "indexBounds" : {
|
// "ratings.score.q1" : [
|
// "[4.0, 4.0]"
|
// ],
|
// "ratings.score.q2" : [
|
// "[9.0, 9.0]"
|
// ]
|
// },
|
// "keysExamined" : 981,
|
// "dupsTested" : 981,
|
// "dupsDropped" : 0,
|
// "seenInvalidated" : 0,
|
// "matchTested" : 0
|
// }
|
// }
|
// }
|
// },
|
// "allPlansExecution" : [ ]
|
// },
|
// "serverInfo" : {
|
// "host" : "durcakubupc",
|
// "port" : 27017,
|
// "version" : "3.0.12",
|
// "gitVersion" : "33934938e0e95d534cebbaff656cde916b9c3573"
|
// },
|
// "ok" : 1
|
//}
|
|