gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:54:19 24 4
gpt4 key购买 nike

我用了很长时间的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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com