Mongodb Mongoose按字段对嵌套数组排序

Mongodb Mongoose按字段对嵌套数组排序,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我有一个GameStatistics集合,我想对所有玩家按分数进行排序 所有玩家都列在带有游戏的嵌套activePlayers数组中。每个玩家都有一个字段点(我在下面列出了代码和模式) 似乎我遗漏了一些东西,我已经尝试过使用aggregate()了,但也没有运气 sort=async(req:Request,res:Response,next:NextFunction)=>{ const id=“002190805”; const stats=await GameStats.findById(i

我有一个GameStatistics集合,我想对所有玩家按分数进行排序

所有玩家都列在带有游戏的嵌套
activePlayers
数组中。每个玩家都有一个字段
(我在下面列出了代码和模式)

似乎我遗漏了一些东西,我已经尝试过使用aggregate()了,但也没有运气

sort=async(req:Request,res:Response,next:NextFunction)=>{
const id=“002190805”;
const stats=await GameStats.findById(id)
.sort({“vTeam.activePlayers.points”:-1})
.exec();
返回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"
  }
]
根据您的解决方案,将
1
替换为
-1

所以:
const stats=await GameStats.findById(id).sort({'vTeam.activePlayers.points':-1}).exec()

根据您的解决方案,将
1
替换为
-1


所以:
const stats=await GameStats.findById(id).sort({'vTeam.activePlayers.points':-1}).exec()

您可以使用mongodb聚合框架来解决此问题

sort=async(req:Request,res:Response,next:NextFunction)=>{
const id=“002190805”;
const stats=等待GameStats.aggregate([
{
$match:{
_id:id,//或mongoose.Types.ObjectId(id)
},
},
{
$unwind:“$vTeam.activePlayers”,
},
{
$sort:{
“vTeam.activePlayers.points”:-1,
},
},
{
$group:{
_id:“$\u id”,
活动玩家:{
$push:“$vTeam.activePlayers”,
},
文件:{
$first:“$$ROOT”,
},
},
},
{
$replaceRoot:{
新根:{
$mergeObjects:[
“$doc”,
{
VTeamActivePlayer:“$ActivePlayer”,
},
],
},
},
},
{
$addFields:{
“vTeam.activePlayers”:“$vTeamActivePlayers”,
},
},
{
$项目:{
VTeamActivePlayer:0,
},
},
]);
返回res.status(200).json(stats);
};

您可以使用mongodb聚合框架来解决此问题

sort=async(req:Request,res:Response,next:NextFunction)=>{
const id=“002190805”;
const stats=等待GameStats.aggregate([
{
$match:{
_id:id,//或mongoose.Types.ObjectId(id)
},
},
{
$unwind:“$vTeam.activePlayers”,
},
{
$sort:{
“vTeam.activePlayers.points”:-1,
},
},
{
$group:{
_id:“$\u id”,
活动玩家:{
$push:“$vTeam.activePlayers”,
},
文件:{
$first:“$$ROOT”,
},
},
},
{
$replaceRoot:{
新根:{
$mergeObjects:[
“$doc”,
{
VTeamActivePlayer:“$ActivePlayer”,
},
],
},
},
},
{
$addFields:{
“vTeam.activePlayers”:“$vTeamActivePlayers”,
},
},
{
$项目:{
VTeamActivePlayer:0,
},
},
]);
返回res.status(200).json(stats);
};

是的,我知道。实际阵列要大得多。我对它进行了修改,以查看sort()是否会对任何内容进行排序(尽管它不会)。但是我忘了把它换回来是的,我知道。实际阵列要大得多。我对它进行了修改,以查看sort()是否会对任何内容进行排序(尽管它不会)。但是我忘了把它换回来