я бы добавил в User
новое поле, такое как NumTasksAssigned
, которое будет вести подсчет количества задач, выполняемых пользователем. если вам не нравится управлять этим счетчиком вручную, вы также можете получить этот счет, выполнив $lookup
при извлечении пользователей для данной роли.
при получении списка пользователи для данной роли, извлекайте их в порядке возрастания по полю NumTasksAssigned
. также ограничьте количество пользователей, возвращаемых количеством имеющихся у вас задач.
итерируйте по списку пользователей и назначайте задачи пользователям и увеличивайте их количество задач.
, если количество задач под рукой превышает количество извлеченных пользователей, не ломайте 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
}
])