我们有代表任务的mongoDB文档。每个任务包含一个所需技能的列表,以及每个技能的数字最低级别。一个人能够处理一项任务,如果他有所有所需的技能,每个人都有足够的水平。
任务示例:
{
required_skills: [
{_id: "skill_A", level: 5},
{_id: "skill_B", level: 2}
]
}具备[{_id: "skill_A", level: 5},{_id: "skill_B", level: 2}]技能的人将能够使用required_skills处理任务:
[{_id: "skill_A", level: 4},{_id: "skill_B", level: 2}][{_id: "skill_A", level: 5}][{_id: "skill_B", level: 1}]但没有使用required_skills的任务:
[{_id: "skill_A", level: 4},{_id: "skill_B", level: 2},{_id: "skill_C", level: 2}] //缺少skill_C[{_id: "skill_A", level: 6},{_id: "skill_B", level: 2}] // Skill_A上的不足级别
我们需要一个mongo查询,以能够找到所有的任务,是可以接受的一个人具有一定的技能。person技能列表将是查询的参数。
出于性能方面的原因,我们希望避免在Mongo中使用javascript函数,以及一个不完整的过滤器,这将迫使我们在java中进行一些后处理,以消除不相关的任务。
我们正在寻找这样的东西:
for each task in collection:
for each skill in task's skills:
- if skill._id is not in the person's skills, filter out the task
- if skill.level is greater than the corresponding skill level of the person, filter out the task
return remaining tasks到目前为止,我们尝试过:
{
"$or":[
{
"skills":{
"$elemMatch":{
"_id":{
"$eq":"skill-2"
},
"level":{
"$lte":3
}}}
},
{
"skills":{
"$elemMatch":{
"_id":{
"$eq":"skill-1"
},
"level":{
"$lte":3
}}}}
]
}但是,有了这个查询,只要其中一项技能是可以接受的,任务就会匹配。这意味着java客户端应用程序必须实现第二个过滤器,以消除不相关的任务。
发布于 2021-01-11 17:55:07
由于我没有实际数据,所以代码没有实际测试。但这可能会奏效:
const searchParams = [
{required_skills:{ $elemMatch: { _id: "Skill_A", level: { $lte: 5 } } }},
{required_skills:{ $elemMatch: { _id: "Skill_B", level: { $lte: 2 } } }},
{required_skills:{ $elemMatch: { _id: "Skill_C", level: { $lte: 8 } } }},
]
const tasksQualified = await taskDB.find({
$or: searchParam
})searchParams的元素可以根据您的需要动态生成。
searchParams.psuh({ $elemMatch: { _id: "Skill_D", level: { $lte: 3 } } })另外,也可以查看this post。
https://stackoverflow.com/questions/65666919
复制相似问题