Node.js使用聚合查找调用MongoDB
我已经使用SQLServer很长时间了,只是真正学习了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
{
"_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和用户登录的最后时间。再次感谢您的快速回复。