Mongodb MonngoDB:从多个参数中筛选对象数组中的多个元素

Mongodb MonngoDB:从多个参数中筛选对象数组中的多个元素,mongodb,pymongo,Mongodb,Pymongo,我有以下格式的文件: "email": "eight@gmail.com", "primary_skills": [ { "name": "Angular", "rating": 4.5 }, { "name": "Rea

我有以下格式的文件:

"email": "eight@gmail.com",
    "primary_skills": [
        {
            "name": "Angular",
            "rating": 4.5
        },
        {
            "name": "React",
            "rating": 3.0
        }
    ],
    "secondary_skills": [
        {
            "name": "Python",
            "rating": 4.5
        },
        {
            "name": "SQL",
            "rating": 3.0
        },
        {
            "name": "Vue",
            "rating": 3.0
        }
    ]
如何根据以下内容筛选用户:

1.)将角度和反应(或任何其他多种技能)作为主要技能且评分大于或等于3的用户(相同的评分适用于角度和反应)

2.)拥有Angular和Python(不管是在初级还是次级,但两者都应该在初级或次级)作为技能且评分大于或等于4的用户


对于第一部分和第二部分,它也应该用于过滤器的动态长度。例如,可以搜索['angular'、'react'],但其他人可以搜索['angular'、'react'、'python'、'aws']。

对于第一个过滤器,您可以使用
$all
并获得包含以下特定数组的所有值:

db.collection.find({
“主要技能.名称”:{
“$all”:[
“棱角的”,
“反应”
]
}
})
此查询将包含“Angular”和“React”的文档返回到
primary\u skills.name
。是必需的。文档包含数组中指示的所有值

另外,对于第二个过滤器,您可以使用
$和
以及
$或

“$and”:[
{“$or”:[{“主要技能.名称”:“角度”},{“次要技能.名称”:“角度”}]},
{“$or”:[{“primary_skills.name”:“Python”},{“secondary_skills.name”:“Python”}]}
]
在这种情况下,
$和
用于确保这两个条件均为真。这两个条件是两个
$或

$或
确保单词作为
主要技能
次要技能
存在

并且,要添加评级,需要使用
$elemMatch
将同一对象与数组进行比较。再次使用
$in
与数组进行比较。
使用
$elemMatch
是为了确保有一个对象与以下两个字段匹配:

“基本技能”:{
“$elemMatch”:{
“姓名”:{
“$in”:[
“Python”,
“AWS”
]
},
“评级”:{
“$gte”:3
}
}
}
现在,大家一起

db.collection.find({
“primary_skills.name”:{“$all”:[“Angular”,“React”]},
“$or”:[{
“初级技能”:{
“$elemMatch”:{
“名称”:{“$in”:[“Python”,“AWS”]},
“评级”:{“$gte”:3}}
}, {
“中等技能”:{
“$elemMatch”:{
“名称”:{“$in”:[“Python”,“AWS”]},
“评级”:{“$gte”:3}}
}]
})

检查

但是评级部分呢?我试过你建议的方法,它可以正确地处理名字,但是用正确的评级过滤不起作用。我将编辑以添加此部分。更新的答案。对于第一部分和第二部分,它应该适用于过滤器的动态长度。例如,一个人可以搜索['angular','react'],但其他人可以搜索['angular','react','python','aws'.@RohitNawale如果我是你,我会给这家伙买杯咖啡:-)