【发布时间】:2017-08-31 21:56:10
【问题描述】:
我正在尝试使用 mongoose 获取用户收集的最后 20 条记录:
User.find({'owner': req.params.id}).
sort(date:'-1').
limit(20).
exec(.....)
这很好,显示最后 20 项。
但是数组中的项目是从最新到最旧的排序的,有没有办法用猫鼬来扭转这个?
谢谢
【问题讨论】:
-
您是否也愿意分享您的收藏。
我正在尝试使用 mongoose 获取用户收集的最后 20 条记录:
User.find({'owner': req.params.id}).
sort(date:'-1').
limit(20).
exec(.....)
这很好,显示最后 20 项。
但是数组中的项目是从最新到最旧的排序的,有没有办法用猫鼬来扭转这个?
谢谢
【问题讨论】:
您当然可以使用聚合来做到这一点,例如:
db.user.aggregate[(
{ $match : {"owner" : req.params.id}},
{ $sort : {"date" : -1}},
{ $limit : 20},
{ $sort : {"date" : 1}}
])
关于此聚合的说明:
更新:我认为find() with cursor methods 是不可能的,因为您需要两个不同的sort() 操作。但是,MongoDB 确实不将它们视为一系列独立操作;文档给出了以一个顺序编写的方法的示例 - sort().limit() - 相当于相反的顺序 - limit().sort(),表明不能依赖该顺序是有意义的。
【讨论】:
查找总数并仅选择最新的 20 个,可能这不是您找到的有效方法,但这会解决您的问题。
User.count({'owner': req.params.id},function(err,count){
if(count){
var skipItem=count-20;
User.find({'owner': req.params.id}).
.skip(skipItem)
.limit(20)
.sort(date:'1').
exec(.....)
}
});
【讨论】:
db.users.aggregate([
{ $match: {
'owner': req.params.id
}},
{ $unwind: '[arrayFieldName]' },
{ $sort: {
'[arrayFieldName]': -1/1,
'date':-1
}}
])
【讨论】: