Node.js 使用聚合查找调用 MongoDB

标签 node.js mongodb

我用了很长时间的SQL Server,刚刚真正学习了MongoDB。我想弄清楚如何进行聚合查找以获取我想要的数据。这是数据库中的示例:

{
  "_id": "1",
  "user_id": "123-88",
  "department_id": "1",
  "type": "start",
  "time": "2017-04-20T19:40:15.329Z"
}

{
  "_id": "2",
  "user_id": "123-88",
  "department_id": "1",
  "type": "stop",
  "time": "2017-04-20T19:47:15.329Z"
}

我想做的是找到部门 1 的每个唯一 user_id,只取最晚时间的记录并告诉我他们是否 oncall。因此,在上面的示例中,用户 123-88 现在没有值类。您将如何进行此查询?我知道你需要这样的东西:

TimeCard.aggregate([
    { $match: {department_id: req.query.department_id}},
    { $sort: { user_id: 1, time: 1 }},
    { $group: { _id: "$user_id", current_type: "$type", lastTime: { $last: "$time" }}}
    ], function(err, docs){
        if(err){console.log(err);}
        else {res.json(docs);}
    });

但我一直在犯错,所以我知道我的逻辑不正确。我知道我是否只有匹配项有效,如果我添加它匹配和排序的排序但最后一组不工作。另外我会添加什么然后只显示待命的人。再次感谢您的帮助。

最佳答案

你可以计算每个 user_id 有多少“类型”,这可以通过 $sum 来完成,如果是奇数,则用户是 oncall,因为有start 没有 stop。仅当您始终为 start 设置 stop 时,此方法才是正确的。

TimeCard.aggregate([

    { $match: { department_id: req.query.department_id } },
    { $sort: { user_id: 1, time: 1 } },
    { $group: { _id: "$user_id", count_types: { $sum: 1 }, lastTime: { $last: "$time" }}},
    { $match: { count_types: { $mod: [ 2, 1 ] } } },

], function(err, docs) {
    if(err) { console.log(err); }
    else { res.json(docs); }
});

关于Node.js 使用聚合查找调用 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43533222/

相关文章:

javascript - nodeJS 和 MySql 中的连接池问题

sql - 分页使用搜索方法(键集)

html - 带有 CSS 的外部 HTML 文件作为 nodemailer 中的电子邮件内容

ruby-on-rails - 为什么在 Mongodb 查询中使用正则表达式会导致它扫描所有文档而不是索引?

javascript - 在express.js服务器中使用条件

javascript - Sequelize include 不适用于 hasOne 关系

node.js - Mongodb 事务 - 无法从快照中读取

node.js - MongoDB 的 db.collection.distinct() 对于每个用户的效率与保存为数据库条目并检索结果的效率

mongodb - 开放时间 MongoDB 的模式

mongodb - 如何删除mongodb中group返回的文档?