查询以获取最新的三个用户,按日期排序-Mongoose Node.js

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查询以获取最新的三个用户,按日期排序-Mongoose Node.js相关的知识,希望对你有一定的参考价值。

这是来自Mongodb的数据(Task.json)

    
        "username": "john",
        "taskId": "001",
        "date": "2020-02-18T20:14:19.000Z",
    ,
    
        "username": "david",
        "taskId": "001",
        "date": "2020-02-18T21:48:19.000Z",
    ,
    
        "username": "john",
        "taskId": "002",
        "date": "2020-02-15T20:20:32.000Z",
    
    ... many more

我要达到的目标

  • 我正在尝试编写一个查询,该查询返回taskId并列出执行任务的最新users(按date排序-降序排列。
  • 我只希望执行任务的最后三个用户显示在列表中,因此user数组不应为每个任务包含更多的3个用户

这是我创建的有关如何使响应成为示例:


  "tasks": [
    
      "taskid": "001",
      "users": [
        
          "username": "david",
          "date": "2020-02-18T21:48:19.000Z"
        ,
        
          "username": "john",
          "date": "2020-02-18T20:14:19.000Z"
        
      ]
    ,
    
      "taskid": "002",
      "users": [
        
          "username": "john",
          "date": "2020-02-15T20:20:32.000Z"
        
      ]
    
  ]

我到目前为止的进展:

router.route("/latest-tasks").get((req, res) => 
    Task.find()
        .sort( date: "desc" )
        .then(doc =>
            res.status(200).json(
                taskId: doc.taskId,
                list: doc.map(doc => 
                    return 
                        username: doc.username,
                        date: doc.date
                    ;
                )
            )
        )
        .catch(err => res.status(400).json("Error: " + err));
);
答案

我建议您使用MongoDB聚合来执行此操作。该查询应该工作:

Todo.aggregate([
  
    $sort:  taskId: 1, date: 1 
  ,
  
    $group: 
      _id: "$taskId",
      users: 
        $push:  username: "$username", date: "$date" 
      
    
  ,
  
    $project: 
      _id: "$taskId",
      users: [
        
          $filter: 
            input: [
               $arrayElemAt: ["$users", 0] ,
               $arrayElemAt: ["$users", 1] ,
               $arrayElemAt: ["$users", 3] 
            ],
            as: "user",
            cond:  $ne: ["$$user", null] 
          
        ,
      ],
    
  
])

说明:

....

以上是关于查询以获取最新的三个用户,按日期排序-Mongoose Node.js的主要内容,如果未能解决你的问题,请参考以下文章

Sql 查询以获取最多 10 条的最新记录并按提到行排名的字段排序 [关闭]

SQL 按日期排序并按用户获取结果

如何以正确的顺序链接查询集,而不是按日期排序,按foreignKey排序?

如何构建查询以获取每个用户的最新行,其中第三个条件位于单独的表中?

我尝试获取一些按日期、编号排序的数据,并获取每件商品的最新价格

从按格式化日期排序的核心数据中获取