$ sort在聚合管道mongo中不起作用

时间:2020-11-11 14:36:00

标签: node.js mongodb mongoose mongodb-query aggregate

我一直在解决这个问题,我完全不知道为什么这行不通。

我有一个庞大的“课程”集合,大约有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(true);

对于这个管道来说,只是找到我是否退出了排序阶段,但是不可能对此做出任何回应……代码待定,直到它引发我这个错误为止:

UnhandledPromiseRejection警告:MongoNetworkTimeoutError:与XXX.XXX.XX.XX的连接11: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'],
  },
});

数据库中有一个文档课程的例子 enter image description here

我试图按swimmerAge进行排序,而不是按时间排序,但一切正常,但按季节出现了同样的问题...

感谢您对我的帮助!

0 个答案:

没有答案