Как я могу назначить задачу пользователям автоматически, чтобы у всех пользователей было одинаковое количество задач? - PullRequest
2 голосов
/ 16 марта 2020

Я создаю автоматический диспетчер задач, который автоматически назначает задачу пользователям с той же ролью, что и роль задачи. Прямо сейчас я получаю общее количество пользователей, имеющих ту же роль, что и задача, а затем использую 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 });
  }
};

1 Ответ

1 голос
/ 16 марта 2020
  1. я бы добавил в User новое поле, такое как NumTasksAssigned, которое будет вести подсчет количества задач, выполняемых пользователем. если вам не нравится управлять этим счетчиком вручную, вы также можете получить этот счет, выполнив $lookup при извлечении пользователей для данной роли.

  2. при получении списка пользователи для данной роли, извлекайте их в порядке возрастания по полю NumTasksAssigned. также ограничьте количество пользователей, возвращаемых количеством имеющихся у вас задач.

  3. итерируйте по списку пользователей и назначайте задачи пользователям и увеличивайте их количество задач.

, если количество задач под рукой превышает количество извлеченных пользователей, не ломайте l oop и продолжайте назначать, пока больше нет задач для назначения.

the Основная проблема с этим подходом состоит в том, что пользователи, которые уже имели некоторые задачи, получили бы больше задач, назначенных им.

мы могли бы придумать некоторый алгоритм, чтобы предотвратить это, и распределить задачи равномерно. но это может быть не сложность, с которой вы хотели бы иметь дело.

обновление: добавлен поисковый запрос

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
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...