Пн goose Сортировка вложенного массива по полю - PullRequest
1 голос
/ 05 апреля 2020

У меня есть коллекция GameStatistics, и я хотел бы отсортировать всех игроков DES C по их баллам.

Все игроки перечислены во вложенном массиве activePlayers с игрой. У каждого игрока есть поле points (ниже я указал код и схему).

Кажется, я что-то упустил, я уже попробовал с aggregate (), но тоже не повезло.

sort = async (req: Request, res: Response, next: NextFunction) => {
  const id = "0021900805";
  const stats = await GameStats.findById(id)
    .sort({ "vTeam.activePlayers.points": -1 })
    .exec();
  return res.status(200).json(stats);
};

Коллекция выглядит так:

[
  {
    "vTeam": {
      "activePlayers": [
        {
          "teamId": "1610612759",
          "firstName": "Lonnie",
          "lastName": "Walker IV",
          "points": "23",
          "assists": "0",
          "rebounds": "4",
          "fgp": "40.0",
          "to": "0",
          "stl": "3",
          "blk": "0"
        },
        {
          "teamId": "1610612759",
          "firstName": "LaMarcus",
          "lastName": "Aldridge",
          "points": "4",
          "assists": "3",
          "rebounds": "14",
          "fgp": "45.0",
          "to": "2",
          "stl": "1",
          "blk": "1"
        }
      ]
    },
    "_id": "0021900805",
    "createdAt": "2020-04-05T15:34:26.457Z",
    "vTeamScore": "114"
  }
]

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Для решения этой проблемы вы можете использовать структуру агрегации mongodb.

Детская площадка

sort = async (req: Request, res: Response, next: NextFunction) => {
  const id = "0021900805";
  const stats = await GameStats.aggregate([
    {
      $match: {
        _id: id, // or mongoose.Types.ObjectId(id)
      },
    },
    {
      $unwind: "$vTeam.activePlayers",
    },
    {
      $sort: {
        "vTeam.activePlayers.points": -1,
      },
    },
    {
      $group: {
        _id: "$_id",
        activePlayers: {
          $push: "$vTeam.activePlayers",
        },
        doc: {
          $first: "$$ROOT",
        },
      },
    },
    {
      $replaceRoot: {
        newRoot: {
          $mergeObjects: [
            "$doc",
            {
              vTeamActivePlayers: "$activePlayers",
            },
          ],
        },
      },
    },
    {
      $addFields: {
        "vTeam.activePlayers": "$vTeamActivePlayers",
      },
    },
    {
      $project: {
        vTeamActivePlayers: 0,
      },
    },
  ]);

  return res.status(200).json(stats);
};
0 голосов
/ 05 апреля 2020

В соответствии с документами mon goose ваше решение было бы заменить 1 на -1

Итак: const stats = await GameStats.findById(id).sort({'vTeam.activePlayers.points': -1}).exec();

...