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

时间:2018-03-15 16:00:27

标签: javascript mongoose mongoose-schema mongoose-populate

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

访问

我可以使用populate将用户名和名字映射到每个通知的字段,问题是我似乎无法在日期字段上进行任何排序

使用此代码我收到错误

  

MongooseError:无法在路径notification.from上填充sort   因为它是文档数组的子属性

是否可以采用不同的方式或更新的方式(深度填充,虚拟)?我在使用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年以来它已经有了一些更新的功能。

2 个答案:

答案 0 :(得分:2)

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

  

问。我在下面的数组下填充嵌套属性   代码:

     

新架构({       arr:[{         child:{ref:' OtherModel',type:Schema.Types.ObjectId}       }]});

     

.populate({路径:&#39; arr.child&#39;,选项:{sort:&#39; name&#39;}})不会按arr.child.name排序?< / p>      

A。请参阅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);
    });

})

答案 1 :(得分:0)

someList
.sorted(Comparator.<SomeClass>comparingInt(s -> Math.abs(s.getValue())).reversed())