mongoose中populate后sort的问题分析及变通解决方法

 0 0条评论

有一张课程表和节点表,是一对多的关系,具体结构如下:

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直接解决的方法,请留言告知,不胜感激。


本文作者:双黑

版权声明:本站文章欢迎链接分享,禁止全文转载!

游客