Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js使用聚合查找调用MongoDB_Node.js_Mongodb - Fatal编程技术网

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

Node.js使用聚合查找调用MongoDB,node.js,mongodb,Node.js,Mongodb,我已经使用SQLServer很长时间了,只是真正学习了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

我已经使用SQLServer很长时间了,只是真正学习了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的每个唯一用户id,只记录最新时间,并告诉我他们是否在线。因此,在上面的示例中,用户123-88现在不是oncall。您将如何进行此查询?我知道你需要这样的东西:

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);}
    });
但我不断出错,所以我知道我的逻辑不正确。我知道如果我只是有匹配,它工作,如果我添加排序,它匹配和排序,但最后一组不工作。此外,我还要补充什么,然后只向人们展示一下,这是一个开放的世界。再次感谢您的帮助。

您可以计算每个
用户id
有多少个“类型”,这可以通过
$sum
完成,如果是奇数,用户是oncall,因为有一个
开始
而没有
停止
。只有在
开始时总是有
停止
时,这种方法才是正确的

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); }
});

它不工作,因为当前类型必须是累加器。如果您想在
当前类型中使用所有
类型
,您可以使用。谢谢luisenrike。我想我不明白。我想小组会把每个不同用户id的所有用户id、类型和lasttime返回给我。这不对吗?是的,没错。是的,这很有效。我知道你做了什么(因为你每次出发都会停下来,所以看起来很奇怪)。我还需要看看$push,因为如果可能的话,我想发回更多的数据,但是这个解决方案确实给了我用户ID和用户登录的最后时间。再次感谢您的快速回复。