

### やりたいこと

処理対象のドキュメントを 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]


CC BY-SA 4.0
2021-07-01T14:52:39.503
77911
2021-07-03T11:58:20.150
2021-07-01T16:23:39.883
3060
16974
question
json mongodb
配列を含むドキュメントの配列内要素に対する並び替えとフィルター


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

以下が私が求めていた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>


CC BY-SA 4.0
2021-07-03T11:58:20.150
77938
2021-07-03T11:58:20.150
16974
77911
answer