Mongoose - 无法在路径 notification.from 上使用排序填充,因为它是文档数组的子属性

Posted

技术标签:

【中文标题】Mongoose - 无法在路径 notification.from 上使用排序填充,因为它是文档数组的子属性【英文标题】:Mongoose - Cannot populate with sort on path notifications.from because it is a subproperty of a document array 【发布时间】:2018-08-24 12:52:09 【问题描述】:

我有一个非常简单的 mongo 方案,我正在使用 mongoose 访问

我可以使用填充将用户名和名字映射到每个通知的发件人字段,问题是我似乎无法对日期字段进行任何排序

使用此代码,我得到一个错误

MongooseError:无法在路径通知上使用排序填充。来自 因为它是文档数组的子属性

是否有可能以不同的方式或更新的方式(深度填充、虚拟)来执行此操作?我在 Mongoose 5 上。

我宁愿不使用 vanilla javascript 之后对对象进行排序或创建单独的架构

var UserSchema = new Schema(  
    username: String,
    firstname: String,
    notifications: [
          
            from:  type: Schema.Types.ObjectId, ref: 'User',
            date: Date,
            desc: String
        
    ]
);

app.get('/notifications', function(req, res) 
    User.findOne( _id: req._id , 'notifications')
    .populate(
        path: 'notifications.from',   
        populate: 
            path: 'from',
            model: 'User',
            options:  sort:  'notifications.date': -1              
        
    ) 
    .exec(function(err, user) 
        if (err) console.log(err)
    )
);

那个可能的重复是关于 Mongo 的近 2 年。我想知道在 Mongoose 中是否有更新或不同的方法来执行此操作,因为自 2016 年以来它已经发生了一些变化,具有更新的功能。

【问题讨论】:

How to sort sub-documents in the array field?的可能重复 那个可能的重复是关于 Mongo 的近 2 年历史。我想知道在 Mongoose 中是否有更新或不同的方法 - 因为它自 2016 年以来发生了一些变化,具有更新的功能。 【参考方案1】:

来自 Mongoose V5.0.12 常见问题解答:http://mongoosejs.com/docs/faq.html#populate_sort_order

Q. 我正在填充一个嵌套属性,如下所示 代码:

新架构( arr:[ 孩子: ref:'OtherModel',类型:Schema.Types.ObjectId ] );

.populate( path: 'arr.child', options: sort: 'name' ) 不会按 arr.child.name 排序?

答。见this GitHub issue。这是一个已知问题,但 非常难以修复。

所以很遗憾,目前是不可能的,

实现此目的的一种方法是简单地使用javascript 的原生sort 在获取后对通知进行排序。

.exec(function(err, user) 
    if (err) console.log(err)

    user.notifications.sort(function(a, b) 
        return new Date(b.date) - new Date(a.date);
    );

)

【讨论】:

当人们使用分页延迟加载时,这不会是一个问题吗? 不,.sort() 仅对您从数据库中获得的结果进行排序,它与 sort: 'notifications.date': -1 所做的事情相同(没有 populate ),它不会更改数据.【参考方案2】:
It can be achievable using nesting populate like this - 

eg - schema - donationHistory: campaignRequestId: [ref ids]

await user.populate(
        path: 'donationHistory.campaignRequestId',
        populate: [
            path: 'campaignRequestId',
            model: 'CampaignRequest',
            options:  sort:  'createdAt': -1  ,
        ],
        ...deepUserPopulation,
    ).execPopulate();

【讨论】:

以上是关于Mongoose - 无法在路径 notification.from 上使用排序填充,因为它是文档数组的子属性的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose - 无法在路径 notification.from 上使用排序填充,因为它是文档数组的子属性

无法将带有点的键(键路径)添加到具有以下类型的 Mongoose 字段:Schema.Types.Mixed

Mongoose:使用 _id 以外的字段填充路径

Mongoose:CastError:在路径“_id”处为值“[object Object]”转换为 ObjectId 失败

节点,js - Mongoose - 无法保存地理多边形 - CastError: Cast to number failed

Mongoose:CastError:在路径“items”处为值“ value:'x'”转换为嵌入失败