Mongo 2d index very very slow

i have a simple collection with 60000 docs and each doc containing 100 fields in which one of them is “coordination” which is an array containing longitude and latitude of each document.

without a 2d index on coordination field, querying geoWithin box takes 100ms.but with the index, it takes 400ms because not only it fetches index keys, but also it fetches the actual documents, even though i have projected on the coordination field

i’m confused.this must be a bug or sth, because we have a covering index ignored!

this is the explain output :

```
db.ProductReport.explain().find({ coordination: { $geoWithin:{ $box:[ [-180,-90],[40,90]]}} } , {coordination:1,_id:0}  )
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "Projections.ProductReport",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "coordination" : {
                "$geoWithin" : {
                    "$box" : [
                        [
                            -180,
                            -90
                        ],
                        [
                            40,
                            90
                        ]
                    ]
                }
            }
        },
        "queryHash" : "AB8EF93D",
        "planCacheKey" : "43E7EF83",
        "winningPlan" : {
            "stage" : "PROJECTION_SIMPLE",
            "transformBy" : {
                "coordination" : 1,
                "_id" : 0
            },
            "inputStage" : {
                "stage" : "FETCH",
                "filter" : {
                    "coordination" : {
                        "$geoWithin" : {
                            "$box" : [
                                [
                                    -180,
                                    -90
                                ],
                                [
                                    40,
                                    90
                                ]
                            ]
                        }
                    }
                },
                "inputStage" : {
                    "stage" : "IXSCAN",
                    "keyPattern" : {
                        "coordination" : "2d"
                    },
                    "indexName" : "coordination_2d",
                    "isMultiKey" : false,
                    "isUnique" : false,
                    "isSparse" : false,
                    "isPartial" : false,
                    "indexVersion" : 2,
                    "direction" : "forward",
                    "indexBounds" : {
                        "coordination" : [
                            "[BinData(128, 0400000000000000), BinData(128, 07FFFFFFFFFFFFFF)]",
                            "[BinData(128, 0C00000000000000), BinData(128, 0FFFFFFFFFFFFFFF)]",
                            "[BinData(128, 1000000000000000), BinData(128, 1FFFFFFFFFFFFFFF)]",
                            "[BinData(128, 2000000000000000), BinData(128, 2FFFFFFFFFFFFFFF)]",
                            "[BinData(128, 3000000000000000), BinData(128, 3FFFFFFFFFFFFFFF)]",
                            "[BinData(128, 4000000000000000), BinData(128, 4FFFFFFFFFFFFFFF)]",
                            "[BinData(128, 5000000000000000), BinData(128, 53FFFFFFFFFFFFFF)]",
                            "[BinData(128, 5800000000000000), BinData(128, 5BFFFFFFFFFFFFFF)]",
                            "[BinData(128, 6000000000000000), BinData(128, 6FFFFFFFFFFFFFFF)]",
                            "[BinData(128, 7000000000000000), BinData(128, 73FFFFFFFFFFFFFF)]",
                            "[BinData(128, 7800000000000000), BinData(128, 7BFFFFFFFFFFFFFF)]",
                            "[BinData(128, 8400000000000000), BinData(128, 87FFFFFFFFFFFFFF)]",
                            "[BinData(128, 9000000000000000), BinData(128, 9FFFFFFFFFFFFFFF)]",
                            "[BinData(128, C000000000000000), BinData(128, C3FFFFFFFFFFFFFF)]",
                            "[BinData(128, C400000000000000), BinData(128, C7FFFFFFFFFFFFFF)]",
                            "[BinData(128, D000000000000000), BinData(128, D3FFFFFFFFFFFFFF)]"
                        ]
                    }
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "masoudy-ubuntu",
        "port" : 27017,
        "version" : "4.4.4",
        "gitVersion" : "8db30a63db1a9d84bdcad0c83369623f708e0397"
    },
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1615554402, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1615554402, 1)
}
``` 

in my understanding, because we have a 2d index on coordination field and because we are projecting only coordination field and excluding _id field, it must only return the result off of the index making it a covering one.doing a count command is event worse and slower.what am i missing here?

even if i try do this with aggregation and first do the projection and then the matching , it will do the same and after using index, it will pass the fetch stage as input to the projection, so it seems it will first fetch all fields of documents and then do the projections part!!

db.ProductReport.explain().aggregate([ {$project:{coordination:1,_id:0}}, {$match:{ coordination: { $geoWithin:{ $box:[ [-180,-90],[40,90]]}}}} ] )

there is section in docs that simply says, GeoSpatial indexes don not cover queries!