用mongoose获取最新的xx记录,如何订购?

时间:2017-04-06 04:05:50

标签: mongodb express mongoose

我正在尝试使用mongoose获取用户集合的最后20条记录:

{{1}}

这很有效,显示最后20项。

但是数组中的项目是从最新到最旧的排序,有没有办法用mongoose来解决这个问题?

由于

3 个答案:

答案 0 :(得分:0)

查找总数并仅选择最新的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(.....)

  }

});

答案 1 :(得分:0)

您当然可以使用聚合来执行此操作,例如:

db.user.aggregate[(
  { $match : {"owner" : req.params.id}},
  { $sort : {"date" : -1}},
  { $limit : 20},
  { $sort : {"date" : 1}}
])

关于此汇总的说明:

  • 前三个部分与您在问题中的查找工作相同
  • 第四部分应用了进一步的排序,它将返回的20条记录从最旧的记录重新排序到最近的
  • 我用原生的MongoDB aggregation语法编写了它;您需要调整代码以生成相同的aggregation from Mongoose

更新:我认为使用find() with cursor methods可能 ,因为您需要两个不同的sort()操作。但是,MongoDB 将它们视为一系列独立操作;文档给出了一个按顺序编写的方法示例 - sort().limit() - 等同于相反的顺序 - limit().sort(),表明订单不能被视为有意义。

答案 2 :(得分:-1)

db.users.aggregate([
    { $match: {
       'owner': req.params.id
    }},
    { $unwind: '[arrayFieldName]' },
    { $sort: {
        '[arrayFieldName]': -1/1,
         'date':-1
    }}
])