innerStage "seek" taking a long time during the "nlj" stage

I have an aggregate looking across a large set of data (hundreds of millions of records).

It’s doing a match → sort by date → group → project

The first match is taking the majority of the time but I don’t understand what the explain tool is telling me.
I can’t find what the “nlj” stage is anywhere and that majority of its time is spent on the seek stage.

Match looks across two string fields with low cardinality and one date field.

{
  "group": "myGroup", // ~50 unique values in the database
  "action": "actionMyGroupIsDoing" // ~20 unique values in the database
  "date": {
        $gte : ISODate("2023-09-21T00:00:00.000"),
        $lte : ISODate("2023-09-21T23:59:59.999")
    }
}

My index that it correctly uses has the following

{
  "group": 1,
  "action": 1,
  "date": -1,
   ...a bunch of other fields that aren't part of the match
   but are part of the later projection,
   was told to do this so my query would be 'covered'
}

I feel like the database should take so long when it has the index setup to match exactly what the query is and the explain below doesn’t really give me enough information. Am I doing something wrong that it’s doing the initial seek in the wrong way? If I expand this search to cover multiple days it can take minutes in that first step. Subsequent queries get faster because it’s cached I assume, but the first query is so long that my API times out.

{
    "stage" : "nlj",
    "planNodeId" : NumberInt(2),
    "nReturned" : NumberInt(9014),
    "executionTimeMillisEstimate" : NumberInt(657),
    "opens" : NumberInt(1),
    "closes" : NumberInt(1),
    "saveState" : NumberInt(60),
    "restoreState" : NumberInt(60),
    "isEOF" : NumberInt(1),
    "totalDocsExamined" : NumberInt(9014),
    "totalKeysExamined" : NumberInt(9014),
    "collectionScans" : NumberInt(0),
    "collectionSeeks" : NumberInt(9014),
    "indexScans" : NumberInt(0),
    "indexSeeks" : NumberInt(1),
    "indexesUsed" : [
        "myIndex"
    ],
    "innerOpens" : NumberInt(9014),
    "innerCloses" : NumberInt(1),
    "outerProjects" : [

    ],
    "outerCorrelated" : [
        NumberLong(9),
        NumberLong(5),
        NumberLong(6),
        NumberLong(7),
        NumberLong(8)
    ],
    "outerStage" : {
        "stage" : "nlj",
        "planNodeId" : NumberInt(1),
        "nReturned" : NumberInt(9014),
        "executionTimeMillisEstimate" : NumberInt(20),
        "opens" : NumberInt(1),
        "closes" : NumberInt(1),
        "saveState" : NumberInt(60),
        "restoreState" : NumberInt(60),
        "isEOF" : NumberInt(1),
        "totalDocsExamined" : NumberInt(0),
        "totalKeysExamined" : NumberInt(9014),
        "collectionScans" : NumberInt(0),
        "collectionSeeks" : NumberInt(0),
        "indexScans" : NumberInt(0),
        "indexSeeks" : NumberInt(1),
        "indexesUsed" : [
            "myIndex"
        ],
        "innerOpens" : NumberInt(1),
        "innerCloses" : NumberInt(1),
        "outerProjects" : [
            NumberLong(8)
        ],
        "outerCorrelated" : [
            NumberLong(10),
            NumberLong(11)
        ],
        "outerStage" : {
            "stage" : "project",
            "planNodeId" : NumberInt(1),
            "nReturned" : NumberInt(1),
            "executionTimeMillisEstimate" : NumberInt(0),
            "opens" : NumberInt(1),
            "closes" : NumberInt(1),
            "saveState" : NumberInt(60),
            "restoreState" : NumberInt(60),
            "isEOF" : NumberInt(1),
            "projections" : {
                "myProjection": 1
            },
            "inputStage" : {
                "stage" : "limit",
                "planNodeId" : NumberInt(1),
                "nReturned" : NumberInt(1),
                "executionTimeMillisEstimate" : NumberInt(0),
                "opens" : NumberInt(1),
                "closes" : NumberInt(1),
                "saveState" : NumberInt(60),
                "restoreState" : NumberInt(60),
                "isEOF" : NumberInt(1),
                "limit" : NumberInt(1),
                "inputStage" : {
                    "stage" : "coscan",
                    "planNodeId" : NumberInt(1),
                    "nReturned" : NumberInt(1),
                    "executionTimeMillisEstimate" : NumberInt(0),
                    "opens" : NumberInt(1),
                    "closes" : NumberInt(1),
                    "saveState" : NumberInt(60),
                    "restoreState" : NumberInt(60),
                    "isEOF" : NumberInt(0)
                }
            }
        },
        "innerStage" : {
            "stage" : "ixseek",
            "planNodeId" : NumberInt(1),
            "nReturned" : NumberInt(9014),
            "executionTimeMillisEstimate" : NumberInt(20),
            "opens" : NumberInt(1),
            "closes" : NumberInt(1),
            "saveState" : NumberInt(60),
            "restoreState" : NumberInt(60),
            "isEOF" : NumberInt(1),
            "indexName" : "myIndex",
            "keysExamined" : NumberInt(9014),
            "seeks" : NumberInt(1),
            "numReads" : NumberInt(9015),
            "recordSlot" : NumberInt(7),
            "recordIdSlot" : NumberInt(9),
            "snapshotIdSlot" : NumberInt(5),
            "indexIdSlot" : NumberInt(6),
            "seekKeySlotLow" : NumberInt(10),
            "seekKeySlotHigh" : NumberInt(11),
            "outputSlots" : [

            ],
            "indexKeysToInclude" : "00000000000000000000000000000000"
        }
    },
    "innerStage" : {
        "stage" : "limit",
        "planNodeId" : NumberInt(2),
        "nReturned" : NumberInt(9014),
        "executionTimeMillisEstimate" : NumberInt(637),
        "opens" : NumberInt(9014),
        "closes" : NumberInt(1),
        "saveState" : NumberInt(60),
        "restoreState" : NumberInt(60),
        "isEOF" : NumberInt(1),
        "limit" : NumberInt(1),
        "inputStage" : {
            "stage" : "seek",
            "planNodeId" : NumberInt(2),
            "nReturned" : NumberInt(9014),
            "executionTimeMillisEstimate" : NumberInt(637),
            "opens" : NumberInt(9014),
            "closes" : NumberInt(1),
            "saveState" : NumberInt(60),
            "restoreState" : NumberInt(60),
            "isEOF" : NumberInt(0),
            "numReads" : NumberInt(9014),
            "recordSlot" : NumberInt(12),
            "recordIdSlot" : NumberInt(13),
            "seekKeySlot" : NumberInt(9),
            "snapshotIdSlot" : NumberInt(5),
            "indexIdSlot" : NumberInt(6),
            "indexKeySlot" : NumberInt(7),
            "indexKeyPatternSlot" : NumberInt(8),
            "fields" : [

            ],
            "outputSlots" : [

            ]
        }
    }
}