【问题标题】:getting the latest xx records with mongoose, How to order them?使用猫鼬获取最新的 xx 记录,如何订购?
【发布时间】:2017-08-31 21:56:10
【问题描述】:

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

User.find({'owner': req.params.id}).
sort(date:'-1').
limit(20).
exec(.....)

这很好,显示最后 20 项。

但是数组中的项目是从最新到最旧的排序的,有没有办法用猫鼬来扭转这个?

谢谢

【问题讨论】:

  • 您是否也愿意分享您的收藏。

标签: mongodb express mongoose


【解决方案1】:

您当然可以使用聚合来做到这一点,例如:

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】:

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

    【讨论】:

    • 不清楚这个查询如何选择最后日期的20个文档,而是按照OP的要求以升序返回它们?跨度>
    【解决方案3】:
    db.users.aggregate([
        { $match: {
           'owner': req.params.id
        }},
        { $unwind: '[arrayFieldName]' },
        { $sort: {
            '[arrayFieldName]': -1/1,
             'date':-1
        }}
    ])
    

    【讨论】:

    • 我认为这里没有放松的必要; OP 从未在其数据中提及任何数组字段。
    猜你喜欢
    • 2017-06-05
    • 2017-07-15
    • 1970-01-01
    • 2017-05-20
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2020-03-31
    相关资源
    最近更新 更多