私は、自動的にタスクの役割と同じ役割を持つユーザーにタスクを割り当てます自動タスクマネージャを構築しています。今、私はタスクと同じ役割を持つユーザーの合計数を取得していますし、次に使用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
ユーザーが持っているどのように多くのタスクの数を維持することになります。手動でこのカウントを管理するために好きではない場合、あなたはまた、Aを行うことで、この数を得ることができます$lookup
与えられた役割のユーザーを検索するとき。与えられた役割のユーザーのリストを取得するとき、それらを取得することで昇順にソート
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
}
])