首页 > 解决方案 > 如何自动将任务分配给用户,以便所有用户可以拥有相同数量的任务

问题描述

我正在构建一个自动任务管理器,它将自动将任务分配给与任务角色具有相同角色的用户。现在,我正在获取与任务具有相同角色的用户总数,然后用于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 });
  }
};

标签: javascriptnode.jsmongodbexpress

解决方案


  1. 我会添加一个新字段来User记录NumTasksAssigned用户有多少任务。如果您不喜欢手动管理此计数,您还可以通过$lookup在检索给定角色的用户时执行 a 来获取此计数。

  2. 当获取给定角色的用户列表时,检索它们按NumTasksAssigned字段升序排序。还限制您手头有多少任务返回的用户数量。

  3. 遍历用户列表并将任务分配给用户并增加他们的任务计数。

如果手头的任务数量大于检索到的用户数量,请不要打破循环并继续分配,直到没有更多任务要分配。

这种方法的主要问题是已经有一些任务的用户会得到更多的任务分配给他们。

我们可以想出一些算法来防止这种情况发生并平均分配任务。但这可能不是您想要处理的并发症。

更新:添加查找查询

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

推荐阅读