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
来完成,如果它是奇数,那么用户正在通话,因为有一个没有stop
的start
。 这种方法是正确的,只有当你总是stop
来start
。
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); } });