-
Type:
Bug
-
Resolution: Done
-
Priority:
Major - P3
-
None
-
Affects Version/s: None
-
Component/s: None
-
None
-
ALL
-
None
-
None
-
None
-
None
-
None
-
None
-
None
$group used on partial _id field does not use index.
I have a collection with an compound index field. For example like this one :
db.test_group_index.insert([
{
_id: {
attr1: "value1",
attr2: "value2",
attr3: "value3.1",
},
attr4: "value4.1"
},
{
_id: {
attr1: "value1",
attr2: "value2",
attr3: "value3.2",
},
attr4: "value4.2"
},
{
_id: {
attr1: "value1",
attr2: "value2",
attr3: "value3.3",
},
attr4: "value4.3"
}
]);
I want to group over two _id field to work only on distinct values for keys attr1 & attr2.
I do this :
db.test_group_index.explain().aggregate([
{
$group: {
_id: {
attr1: "$_id.attr1",
attr2: "$_id.attr2"
},
attr4: {
$first: "$attr4"
}
}
}
])
The result of this explain query shows that a COLLSCAN is used.
{
"stages" : [
{
"$cursor" : {
"query" : {
},
"fields" : {
"attr4" : 1,
"_id" : 1
},
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "ref.test_group_index",
"indexFilterSet" : false,
"parsedQuery" : {
},
"queryHash" : "8B3D4AB8",
"planCacheKey" : "8B3D4AB8",
"winningPlan" : {
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : [ ]
}
}
},
{
"$group" : {
"_id" : {
"attr1" : "$_id.attr1",
"attr2" : "$_id.attr2"
},
"attr4" : {
"$first" : "$attr4"
}
}
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1590759417, 4),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : 0
}
},
"operationTime" : Timestamp(1590759414, 1)
}