Node.js $sort不';t在mongo骨料管道中工作

Node.js $sort不';t在mongo骨料管道中工作,node.js,mongodb,mongoose,mongodb-query,aggregate,Node.js,Mongodb,Mongoose,Mongodb Query,Aggregate,我被困在这个问题上,我完全不知道为什么这不起作用 我有一个巨大的“课程”收藏,大约有1200万份文档,我想做这件事,并在上面聚合管道。这是我的代码: const records = await Course.aggregate([ { $match: { swimmer: ObjectId('5fa750d9c4a9ca53c5347dc6') }, }, { $sort: { time: 1 }, }, { $group: { _id: { season: '$

我被困在这个问题上,我完全不知道为什么这不起作用

我有一个巨大的“课程”收藏,大约有1200万份文档,我想做这件事,并在上面聚合管道。这是我的代码:

const records = await Course.aggregate([
{
  $match: { swimmer: ObjectId('5fa750d9c4a9ca53c5347dc6') },
},
{
  $sort: { time: 1 },
},
{
  $group: {
    _id: {
      season: '$season',
      bassin: '$bassin',
      type: '$type',
      disance: '$distance',
    },
    course: { $first: '$$ROOT' },
  },
},
]).allowDiskUse(真)

对于这条管道的工作,只要看看我是否取消了排序阶段,但它不可能得到任何回应。。。代码将挂起,直到它向我抛出以下错误:

未经处理的PromiserEjectionWarning:MongoNetworkTimeoutError:到XXX.XXX.XX.XX:XXXX的连接超时

我在排序之前匹配数据,以避免进行大规模排序,只有大约200个文档需要排序,并且有一个及时的索引

我真的不明白为什么这个聚合不能将结果发送给我

这是我的模式:

   const courseSchema = new mongoose.Schema({
  type: {
    bassin: {
      type: String,
      enums: ['25M', '50M'],
      required: [true, 'Une course doit avoir une taille de bassin'],
    },
    nage: {
      type: String,
      enums: ['NAGE_LIBRE', 'BRASSE', 'DOS', 'PAPILLON', 'QUATRE_NAGES'],
      required: [true, 'Une course doit avoir un type de nage'],
    },
    distance: {
      type: String,
      enums: ['50M', '100M', '200M', '400M', '800M', '1500M'],
      required: [true, 'Une course doit avoir une distance'],
    },
  },
  time: { type: Number, required: [true, 'Une course doit avoir un temps'] },
  tempsPassages: {
    type: Map,
    of: Number,
  },date: { type: Date, required: [true, 'Une course doit avoir une date'] },
  season: {
    type: Number,
    min: [2000, 'La saison ne peut être inférieur à 2000'],
    max: [
      new Date().getFullYear() + 1,
      `La saison ne peut être supérieur à ${new Date().getFullYear() + 1}`,
    ],
    required: [true, 'Une course doit avoir une saison'],
  },
  place: { type: String, lowercase: true, trim: true },
  niveauCompetition: {
    type: String,
    enums: ['DEP', 'REG', 'NAT', 'ZON', 'INT'],
    // required: [true, 'Une course doit avoir un niveau de compétition'],
  },
  swimmer: {
    type: mongoose.Schema.ObjectId,
    ref: 'Swimmer',
    required: [true, 'Une course doit avoir un nageur'],
  },
  club: {
    name: {
      type: String,
      required: [true, 'Un club doit avoir un nom'],
      trim: true,
      // unique: [true, 'Nom de club déjà existant'],
    },
    _id: {
      type: mongoose.Types.ObjectId,
      ref: 'Club',
      required: [true, 'Un club doit avoir un identifiant FFN'],
    },
    departement: {
      type: String,
      required: [true, 'Un club doit avoir un département'],
      trim: true,
      enum: enums.EDepartement,
    },
    region: {
      type: String,
      required: [true, 'Un club doit avoir un région'],
      trim: true,
      enum: enums.ERegion,
    },
    country: {
      type: String,
      trim: true,
      enum: ['FRANCE'],
      default: 'FRANCE',
    },
  },
  notes: {
    country: Number,
    region: Number,
    departement: Number,
    club: Number,
  },
  swimmerAge: {
    type: Number,
    required: [true, "L'age du nageur doit etre fourni"],
  },
  swimmerCategory: {
    type: String,
    required: [true, 'La catégory du nageur doit etre fournie'],
    enums: ['AVENIRS', 'JEUNES', 'JUNIORS', 'SENIORS'],
  },
  swimmerSex: {
    type: String,
    required: [true, 'Le sexe du nageur doit etre fournie'],
    enums: ['F', 'M'],
  },
});

数据库中有一个文档课程的示例

我试着按游泳年龄而不是时间来分类,但按季节来分类,同样的问题


谢谢你帮助我

你可以发布你的模式吗?当然可以,这是我的模式:我刚刚发布了。你想用
$project
做什么?你能解释一下你查询的目的吗?我想得到一个按季节排列的最高表现列表,bassin=pool,type=比赛类型,distance是比赛的距离。为此,我首先由游泳者进行比赛,让这位游泳者完成所有比赛,然后我需要按时间对它们进行排序,最后按季节、贝辛、类型和距离分组,并保持第一场比赛(最高)