javascript - 使用多种变体过滤 MongoDB 集合

标签 javascript mongodb

我有一个这样的集合:

[
    {"userId": "0000", "algorithm": "algo1", "status": "Running",   "waitingTime": 0},
    {"userId": "0001", "algorithm": "algo1", "status": "Received",  "waitingTime": 0},
    {"userId": "0000", "algorithm": "algo2", "status": "Completed", "waitingTime": 123},
    {"userId": "0000", "algorithm": "algo2", "status": "Error",     "waitingTime": 134},
    {"userId": "0001", "algorithm": "algo2", "status": "Error",     "waitingTime": 150},
    {"userId": "0001", "algorithm": "algo3", "status": "Completed", "waitingTime": 100},
    {"userId": "0000", "algorithm": "algo3", "status": "Completed", "waitingTime": 120},
    {"userId": "0001", "algorithm": "algo1", "status": "Received",  "waitingTime": 0}
]

我需要找到每个用户的最长等待时间,但仅限于状态“已完成”。每个文档的输出应该有 2 个 props。

  • “_id” - 应为原始集合中的“userId”
  • “maxWaitingTime” - 应等于“已完成”状态的最长等待时间

对于此示例,输出应如下所示:

[
    {"_id": "0000", "maxWaitingTime": 123},
    {"_id": "0001", "maxWaitingTime": 100}
]

我尝试将一些过滤查询组合在一起,但效果不佳。我可以结合一两个陈述,但对于这一个我很挣扎。

我尝试将 unique 方法与 find 结合起来以获得唯一的 userId,但没有成功:

db.tasks.distinct("userId").find();

我还尝试执行 find 函数内部的逻辑:

printjsononeline(db.tasks.distinct(userId).find({
    userId: "0001"
}).map(doc => doc));

但不幸的是,它不起作用。

最佳答案

Playground

db.collection.aggregate([
  {
    "$match": {//Filter completed
      "status": "Completed"
    }
  },
  {
    $group: {//Group by user id and find max
      "_id": "$userId",
      "waitingTime": {
        "$max": "$waitingTime"
      }
    }
  }
])

注意:Mongo 区分大小写。人们确实使用 waiting_time 而不是 waitingTime。

关于javascript - 使用多种变体过滤 MongoDB 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65748264/

相关文章:

arrays - Mongoose中,基于数组查询字段

node.js - 在 mongodb 中查找具有特定字段的所有集合

javascript - 如何创建新的 Mongo ObjectId

javascript - 如何在 google map api v3 上添加切换按钮?

node.js - 如何找到我的 mongoDB 的远程 URL 以在我的 Node.js 代码中使用?

node.js - req.body 在放置请求时返回空对象

mongodb - 无法针对添加到 2.6.8 副本集的 Mongodb 3.0.1 成员进行身份验证

php - 2 个连续的 JQuery 帖子,第二个先执行

javascript - 包含了 babel polyfill,但是 forEach 在 IE11 的 NodeLists 上仍然不起作用

javascript - 使用 JavaScript 进行幻灯片放映