配列を含むドキュメントの配列内要素に対する並び替えとフィルター


### やりたいこと

処理対象のドキュメントを mongoDB のコマンドで、下記した期待する結果を出力したいです。  
(一部配列を含まないドキュメントもあります)

### 処理対象のドキュメント

[code]

    {
        "_id": ObjectId("60ddc26b03edfb7a6b424f10"),
        "member": [
            {
                "joinDate": "2021-07-01 12:00:00.000",
                "username": "John"
            },
            {
                "joinDate": "2021-07-01 13:00:00.000",
                "username": "Maria"
            }
        ],
        "createdAt": "2021-07-01 11:00",
        "roomName": "roomA",
    }
    {
        "_id": ObjectId("60ddbcccd495870939756dcb"),
        "member": [
            {
                "joinDate": "2021-07-01 14:00:00.000",
                "userName": "Jack"
            },
            {
                "joinDate": "2021-07-01 11:00:00.000",
                "userName": "George"
            }
        ],
        "createdAt": "2021-07-01 10:00",
        "roomName": "roomB"
    }
    {
        "_id": ObjectId("60ddbcccd495870939756dcc"),
        "createdAt": "2021-07-01 12:00",
        "roomName": "roomC"
    }
    
[/code]

以下の条件を満たす結果を出力する

  * joinDateが最も新しい要素のみドキュメント内の配列の2つの要素をドキュメントに展開する
  * 更に配列の要素名を変更し(接頭辞にlatestを付与)する
  * ドキュメントをlatestJoinDateの降順に並び替える
  * memberの要素が存在しないドキュメントは出力しない

### 期待する結果

[code]

    {
        "_id": ObjectId("60ddbcccd495870939756dcb"),
        "latestJoinDate": "2021-07-01 14:00:00.000",
        "latestUserName": "Jack",
        "createdAt": "2021-07-01 10:00",
        "roomName": "roomB"
    }
    {
        "_id": ObjectId("60ddc26b03edfb7a6b424f10"),
        "latestJoinDate": "2021-07-01 13:00:00.000",
        "latestUserName": "Maria",
        "createdAt": "2021-07-01 11:00",
        "roomName": "roomA",
    }
    
[/code]




こちら自己解決しました!

以下が私が求めていたQueryです。

[code]

    db.collection.aggregate([
      {
        $match: {
          member: {
            $exists: true
          }
        }
      },
      {
        $addFields: {
          member: {
            $arrayElemAt: [
              "$member",
              {
                $indexOfArray: [
                  "$member.joinDate",
                  {
                    $max: "$member.joinDate"
                  }
                ]
              }
            ]
          }
        }
      },
      {
        $project: {
          createdAt: 1,
          roomName: 1,
          latestJoinDate: "$member.joinDate",
          latestUserName: "$member.userName"
        }
      },
      {
        $sort: {
          latestJoinDate: -1
        }
      }
    ])
    
[/code]

<https://mongoplayground.net/p/mYE2Q1tk4ij>

