有一张课程表和节点表,是一对多的关系,具体结构如下:
import baseSchema from '../../../baseSchema.js'
import mongoose from 'mongoose'
const subSchema = mongoose.Schema({
node: {
// 关联节点表
type: mongoose.Schema.Types.ObjectId,
ref: 'AuthNode',
}, content: {
type: String,
required: [true, '内容不能为空'],
}
}, { _id: false })// 子节点不需要id
export default baseSchema().add({
sections: [subSchema]
})
通过以下语句查询:
AuthCourseModel.findById(ID)
.populate({ path: 'sections.node', select: 'sort nodename -_id'})
出来结果如下:
这里我想根据node下的sort属性来倒序,就那么简单的一个逻辑,整整搜索了10几个小时,一直没有搞定,包括升级最新的mongodb和mongoose,通常思路是在populate中加入以下语句可以实现:
options: { sort: { 'sort': -1 }
但是会报错误:
MongooseError: Cannot populate with `sort` on path sections.node
because it is a subproperty of a document array at getModelsMapForPopulate
大致意思就是不能根据子节点元素来排序。
查阅各种资料,貌似可以通过aggregate函数可以解决,不过肯定又要花费大量时间了。
最后使用了一个变通的方法,通过js的sort()函数来实现,不再通过mongoose来实现了,那么问题就简单了,先定义这样一个方法:
function mySort(s1, s2) {
if (s1.node.sort < s2.node.sort) {
return 1
}
else {
return -1
}
}
之后在路由里进行简单过滤,即可实现:
let result = await new AuthCourse().findOneByID(ID)//获得数据库操作类
result.sections=result.sections.sort(mySort)
虽然最终可以实现我的业务逻辑,不过心里那个坎还是没有过去,有哪位大神可以告知mongoose直接解决的方法,请留言告知,不胜感激。