首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据对象数组中的属性筛选出MongoDB文档

根据对象数组中的属性筛选出MongoDB文档
EN

Stack Overflow用户
提问于 2021-01-11 12:29:51
回答 1查看 151关注 0票数 1

我们有代表任务的mongoDB文档。每个任务包含一个所需技能的列表,以及每个技能的数字最低级别。一个人能够处理一项任务,如果他有所有所需的技能,每个人都有足够的水平。

任务示例:

代码语言:javascript
复制
{
  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中进行一些后处理,以消除不相关的任务。

我们正在寻找这样的东西:

代码语言:javascript
复制
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

到目前为止,我们尝试过:

代码语言:javascript
复制
{
   "$or":[
      {
         "skills":{
            "$elemMatch":{
               "_id":{
                  "$eq":"skill-2"
               },
               "level":{
                  "$lte":3
               }}}
      },
      {
         "skills":{
            "$elemMatch":{
               "_id":{
                  "$eq":"skill-1"
               },
               "level":{
                  "$lte":3
               }}}}
   ]
}

但是,有了这个查询,只要其中一项技能是可以接受的,任务就会匹配。这意味着java客户端应用程序必须实现第二个过滤器,以消除不相关的任务。

EN

回答 1

Stack Overflow用户

发布于 2021-01-11 17:55:07

由于我没有实际数据,所以代码没有实际测试。但这可能会奏效:

代码语言:javascript
复制
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的元素可以根据您的需要动态生成。

代码语言:javascript
复制
searchParams.psuh({ $elemMatch: { _id: "Skill_D", level: { $lte: 3 } } })

另外,也可以查看this post

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65666919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档