Node.js $sort不';t在mongo骨料管道中工作
我被困在这个问题上,我完全不知道为什么这不起作用 我有一个巨大的“课程”收藏,大约有1200万份文档,我想做这件事,并在上面聚合管道。这是我的代码: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: '$
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是比赛的距离。为此,我首先由游泳者进行比赛,让这位游泳者完成所有比赛,然后我需要按时间对它们进行排序,最后按季节、贝辛、类型和距离分组,并保持第一场比赛(最高)