Node.js Mongoose聚合管道每次返回不同的结果

Node.js Mongoose聚合管道每次返回不同的结果,node.js,mongoose,Node.js,Mongoose,我有一个聚合管道,它应该返回一个有序数组。然而每次我创建API cal时,它每次都返回不同的顺序。这是我的密码 exports.getResultToCompetition = asyncHandler(async (req, res, next) => { const data = await Result.aggregate([ { $match: { competition: mongoose.Types.ObjectId(req.params.com

我有一个聚合管道,它应该返回一个有序数组。然而每次我创建API cal时,它每次都返回不同的顺序。这是我的密码

    exports.getResultToCompetition = asyncHandler(async (req, res, next) => {
  const data = await Result.aggregate([
    {
      $match: { competition: mongoose.Types.ObjectId(req.params.competitionId) },
    },
    {
      $project: {
        points: 1,
        kilogramms: 1,
        sector: 1,
        user: 1,
        competition: 1,
        place: 1,
      },
    },
    {
      $sort: {
        kilogramms: -1,
      },
    },
    {
      $lookup: {
        from: "users", // must be the PHYSICAL name of the collection
        localField: "user",
        foreignField: "_id",
        as: "user",
      },
    },
    {
      $addFields: {
        user: {
          $arrayElemAt: ["$user", 0],
        },
      },
    },
    {
      $group: {
        _id: "$sector",
        res: {
          $push: "$$ROOT",
        },
      },
    },
  ]);

  res.status(200).json({ success: true, data });
});
以及模式:

const mongoose = require('mongoose');

const ResultSchema = new mongoose.Schema({
  competitionSeries: {
    type: String,
    default: 0,
  },
  points: {
    type: Number,
    default: 0,
  },
  sector: {
    type: String,
  },
  kilogramms: {
    type: Number,
    default: 0,
  },
  place: {
    type: Number,
    default: 0,
  },
  isCompetitionRunning: {
    type: Boolean,
    default: true,
  },
  user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User',
    required: true,
  },
  team: {
    name: {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User',
    },
    partner: {
      type: String,
    },
    teamName: {
      type: String,
    },
  },

  competition: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Competition',
    required: true,
  },
});

module.exports = Result = mongoose.model('Result', ResultSchema);
千克字段保存为MongoDB数据库中的双精度字段 我将React中前端的值设置为数字。 我不确定这是否是问题的根源。 千克值应该是一个浮点数,如14.5

这是正确的结果:

{
    "success": true,
    "data": [
        {
            "_id": "B",
            "res": [
                {
                    "_id": "5eca12e2607c2c0017c16904",
                    "points": 1,
                    "kilogramms": 90.52,
                    "place": 59,
                    "sector": "B",
                    "competition": "5eb90caa7b45620017a4d919",
                    "user": {
                        "_id": "5eb82c89e5d6cc0017e71a2a",
                        "avatar": "placeholder.jpg",
                        "role": "user"

                    }
                },
                {
                    "_id": "5eca1406607c2c0017c16918",
                    "points": 2,
                    "kilogramms": 39.45,
                    "place": 10,
                    "sector": "B",
                    "competition": "5eb90caa7b45620017a4d919",
                    "user": {
                        "_id": "5eb83175e5d6cc0017e71a42",
                        "avatar": "653571a228226499806e8a717cf2d6e1",
                        "role": "user"

                    }
                },
                {
                    "_id": "5eca11fc607c2c0017c168f5",
                    "points": 3,
                    "kilogramms": 29.62,
                    "place": 8,
                    "sector": "B",
                    "competition": "5eb90caa7b45620017a4d919",
                    "user": {
                        "_id": "5eb83970e5d6cc0017e71a64",
                        "avatar": "1589316331809-feederuser",
                        "role": "user"
                    }
                },
                {
                    "_id": "5eca1250607c2c0017c168fa",
                    "points": 4,
                    "kilogramms": 24.25,
                    "place": 56,
                    "sector": "B",
                    "competition": "5eb90caa7b45620017a4d919",
                    "user": {
                        "_id": "5eb83a00e5d6cc0017e71a67",
                        "avatar": "placeholder.jpg",
                        "role": "user"
                    }
                }

            ]
        },
        {
            "_id": "C",
            "res": [
                {
                    "_id": "5eca12cc607c2c0017c16903",
                    "points": 1,
                    "kilogramms": 72.43,
                    "place": 52,
                    "sector": "C",
                    "competition": "5eb90caa7b45620017a4d919",
                    "user": {
                        "_id": "5eb83c2ee5d6cc0017e71a70",
                        "avatar": "56065850e67a64878e5034d06cecc0ea",
                        "role": "user"
                    }
                },
                {
                    "_id": "5eca1307607c2c0017c16907",
                    "points": 2,
                    "kilogramms": 43.35,
                    "place": 12,
                    "sector": "C",
                    "competition": "5eb90caa7b45620017a4d919",
                    "user": {
                        "_id": "5eb998864d62090017231ce6",
                        "avatar": "placeholder.jpg",
                        "role": "user",
                        "name": "Halász Tibor"
                    }
                },
                {
                    "_id": "5eca1325607c2c0017c16909",
                    "points": 3,
                    "kilogramms": 39.43,
                    "place": 15,
                    "sector": "C",
                    "competition": "5eb90caa7b45620017a4d919",
                    "user": {
                        "_id": "5eb9b46c4d62090017231cf8",
                        "avatar": "placeholder.jpg",
                        "role": "user"
                    }
                },
                {
                    "_id": "5eca14c1607c2c0017c16927",
                    "points": 4,
                    "kilogramms": 36.99,
                    "place": 11,
                    "sector": "C",
                    "competition": "5eb90caa7b45620017a4d919",
                    "user": {
                        "_id": "5eb82fdbe5d6cc0017e71a3d",
                        "avatar": "placeholder.jpg",
                        "role": "user"
                    }
                }
            ]
        }
    ]
}

在我再次调用端点之后,它显示了不同的顺序。也就是说,C区排在第一位,这是不正确的,因为B区的千克数结果更高。

您可以在文档中添加一个最大千克数字段,并通过在聚合末尾添加以下阶段来按该字段排序

{
$addFields:{
“最大千克”:{
$max:“$res.kg”
}
}
},
{
$sort:{
最大千克:-1,
},
},
{
$项目:{
最大千克:0
}
}

不同的结果是什么意思?你能把不同的结果添加到问题中吗?@SuleymanSah添加了结果。那么问题是什么?它对千克进行了正确排序,如果您想按字段对主文档进行排序,可以在末尾添加一个排序阶段。@SuleymanSah。在我的代码上添加了新注释。在我再次调用端点之后,它显示了不同的顺序。也就是说,C区排在第一位,这是不正确的,因为B区的结果更高。你检查我的答案了吗?这能解决你的问题吗?