Details
-
Bug
-
Resolution: Works as Designed
-
Major - P3
-
None
-
3.4.15
-
None
-
ALL
-
(copied to CRM)
Description
When perform "count" with "$elemmatch" in the query it never uses COUNT_SCAN and has to FETCH document before counting. Here is an example:
//create a simple document that has an array of embedded doc, like this:
|
var doc = {
|
"annotationList": [ |
{
|
"meta": { |
"league": "league_value1", |
"class": "class_value1" |
}
|
},
|
{
|
"meta": { |
"league": "league_value1", |
"class": "class_value1" |
}
|
}
|
]
|
}
|
|
|
//save doc to the collection
|
db.testCollection.save(doc);
|
|
|
|
|
//build compound index using 2 multikey field
|
db.testCollection.ensureIndex({"annotationList.meta.league": 1, "annotationList.meta.league": 1}); |
Now if we perform the following:
db.testCollection.explain("executionStats").count({ |
|
"annotationList": { |
"$elemMatch": { |
"meta.league": "league_value1" |
}
|
}
|
|
});
|
We can see that it does the following: XSCAN -> FETCH -> COUNT
However if we do the following:
cursor = db.testCollection.explain("executionStats").count({ |
|
"annotationList.meta.league": "league_value1" |
|
|
});
|
We can see that now there is not need to FETCH documents and it simply performs COUNT_SCAN
Attachments
Issue Links
- is related to
-
SERVER-37290 Avoid FETCH stage with $elemmatch if using covered index and multiKeyPaths is correct
-
- Closed
-
- related to
-
SERVER-27494 Avoid unwind on multi-key index field for covered index aggregation
-
- Backlog
-
-
SERVER-41594 Covered query don't use index for range $gt+$lt. Only for one side and FETCH filter for another
-
- Closed
-