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" } 

我想要做的是find部门1的每个唯一的user_id,只logging最新的时间,并告诉我他们是否打电话。 所以在上面的例子中,用户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);} }); 

但我一直在错误,所以我知道我的逻辑不正确。 我知道如果我只是有匹配它的作品,如果我添加sorting匹配和sorting,但最终的组不起作用。 此外,我会添加什么,然后只显示的人oncall。 再次感谢你的帮助。

你可以计算每个user_id有多less个“types”,这可以通过$sum来完成,如果它是奇数,那么用户正在通话,因为有一个没有stopstart 。 这种方法是正确的,只有当你总是stopstart

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