javascript - 如何自动将任务分配给用户,以便所有用户可以拥有相同数量的任务
问题描述
我正在构建一个自动任务管理器,它将自动将任务分配给与任务角色具有相同角色的用户。现在,我正在获取与任务具有相同角色的用户总数,然后用于math.random()
生成一个从 0 到具有相同角色的用户的长度的数字,并将任务分配给该随机用户。这效率不高,因为一个用户可以有 10 个任务,而另一个用户只有 4 个任务。有没有办法可以将任务顺序分配给与任务具有相同角色的所有用户?这是创建新任务的代码:
exports.createNewTask = async (req, res) => {
try {
let task = new Task({
title: req.body.title,
description: req.body.description,
role: req.body.role,
priority:req.body.priority
});
let role = req.body.role;
let user = await User.find({ role: role });
if(user.length == 0) {
res.status(500).json({message:"Please Create a User With this role" });
}
let random = Math.floor(Math.random() * user.length);
let assignedUser = user[random]._id;
task.user = assignedUser;
let assignedTask = await task.save()
res.status(200).json({ assignedTask });
} catch (err) {
console.log(err);
res.status(500).json({ error: err });
}
};
解决方案
我会添加一个新字段来
User
记录NumTasksAssigned
用户有多少任务。如果您不喜欢手动管理此计数,您还可以通过$lookup
在检索给定角色的用户时执行 a 来获取此计数。当获取给定角色的用户列表时,检索它们按
NumTasksAssigned
字段升序排序。还限制您手头有多少任务返回的用户数量。遍历用户列表并将任务分配给用户并增加他们的任务计数。
如果手头的任务数量大于检索到的用户数量,请不要打破循环并继续分配,直到没有更多任务要分配。
这种方法的主要问题是已经有一些任务的用户会得到更多的任务分配给他们。
我们可以想出一些算法来防止这种情况发生并平均分配任务。但这可能不是您想要处理的并发症。
更新:添加查找查询
var numTasks = 10;
var roleName = "some role";
db.users.aggregate([
{
$match: { role: roleName }
},
{
$lookup: {
from: "tasks",
localField: "_id",
foreignField: "user",
as: "tasks"
}
},
{
$addFields: {
tasks: { $size: "$tasks" }
}
},
{
$sort: { tasks: 1 }
},
{
$limit: numTasks
}
])
推荐阅读
- javascript - 有没有更好的方法通过对 API 的异步调用来组织这个 React 页面?
- git - 使用项目设置 Qt Creator 时出现问题,运行“git”时出错:execve:没有这样的文件或目录
- ios - 将音频从 AVAsset 写入 AVAudioPCMBuffer
- apollo-client - 将令牌从 auth0 注入到 React-admin Hasura 数据提供者
- android - Google Assistant App Actions codelab 示例在 AndroidTV 上不起作用(Fit Actions)
- python - 如何进行数学运算{例如。diff()} 在 DataFrame 的多个列中,并将结果作为新列保存在同一个 DataFrame 中
- python - 从 Txt 文件 python 中提取特定数据
- r - 如果我要导入 excel 文件,如何使用 flexdashboard?
- html - 我想将社交媒体详细信息并排对齐(按列而不是按行排列)。现在它是一个在另一个之下
- java - 如何计算java中的唯一值