PyMongo:查询同一集合中的多个数组
PyMongo: Querying in muiltple arrays within the same collection
假设我在文档中插入了以下条目。
{
"email": "test1@test.com",
"primary_skills":[
{"name": "python", "rating":4.0},
{"name": "Django", "rating": 4.5},
{"name": "AWS", "rating":3.0}
],
"secondary_skills":[
{"name": "Angular", "rating": 4.5},
{"name": "React", "rating":3.0}
]
}, {
"email": "test2@test.com",
"primary_skills":[
{"name": "python", "rating":4.0},
{"name": "Django", "rating": 4.5},
{"name": "SQL", "rating": 3.5},
{"name": "AWS", "rating":3.0}
],
"secondary_skills":[
{"name": "Angular", "rating": 4.0},
{"name": "React", "rating":3.5}
]
}
我想查找给定技能名称、评级和技能类型(主要或次要或两者)的所有用户(电子邮件)。
例如1 在 python 中找到评分高于 3 并标记为主要技能的用户。
例如2 在 angular 中找到主要和次要技能评分都在 3.5 以上的用户。
我应该如何编写最佳查询?
您可以使用 $elemMatch 筛选结果。
1)
db.collection.find({
primary_skills: {
"$elemMatch": {
name: "python",
rating: {
$gt: 3
}
}
}
},
{
email: 1
})
db.collection.find({
primary_skills: {
"$elemMatch": {
name: "Angular",
rating: {
$gt: 3.5
}
}
},
secondary_skills: {
"$elemMatch": {
name: "Angular",
rating: {
$gt: 3.5
}
}
}
},
{
email: 1
})
假设我在文档中插入了以下条目。
{
"email": "test1@test.com",
"primary_skills":[
{"name": "python", "rating":4.0},
{"name": "Django", "rating": 4.5},
{"name": "AWS", "rating":3.0}
],
"secondary_skills":[
{"name": "Angular", "rating": 4.5},
{"name": "React", "rating":3.0}
]
}, {
"email": "test2@test.com",
"primary_skills":[
{"name": "python", "rating":4.0},
{"name": "Django", "rating": 4.5},
{"name": "SQL", "rating": 3.5},
{"name": "AWS", "rating":3.0}
],
"secondary_skills":[
{"name": "Angular", "rating": 4.0},
{"name": "React", "rating":3.5}
]
}
我想查找给定技能名称、评级和技能类型(主要或次要或两者)的所有用户(电子邮件)。
例如1 在 python 中找到评分高于 3 并标记为主要技能的用户。
例如2 在 angular 中找到主要和次要技能评分都在 3.5 以上的用户。
我应该如何编写最佳查询?
您可以使用 $elemMatch 筛选结果。
1)
db.collection.find({
primary_skills: {
"$elemMatch": {
name: "python",
rating: {
$gt: 3
}
}
}
},
{
email: 1
})
db.collection.find({
primary_skills: {
"$elemMatch": {
name: "Angular",
rating: {
$gt: 3.5
}
}
},
secondary_skills: {
"$elemMatch": {
name: "Angular",
rating: {
$gt: 3.5
}
}
}
},
{
email: 1
})