我一直在解决这个问题,我完全不知道为什么这行不通。
我有一个庞大的“课程”集合,大约有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进行排序,而不是按时间排序,但一切正常,但按季节出现了同样的问题...
感谢您对我的帮助!