我必须通过对象数组来过滤候选文档。
在文档中,我有以下字段:
skills = [
{ _id: 'blablabla', skill: 'Angular', level: 3 },
{ _id: 'blablabla', skill: 'React', level: 2 },
{ _id: 'blablabla', skill: 'Vue', level: 4 },
];当我发出请求时,我得到了其他技能数组,例如:
skills = [
{ skill: 'React', level: 2 },
];因此,我需要构建一个查询来获取包含此技能和更高或更高级别的文档。
我尝试执行以下操作:
const conditions = {
$elemMatch: {
skill: { $in: skills.map(item => item.skill) },
level: { $gte: { $in: skills.map(item => item.level) } }
}
};
Candidate.find(conditions)...第一个看起来很好用,但第二个不起作用。
有什么想法吗?
提前谢谢你!
发布于 2020-05-28 01:15:03
这个查询有很多问题...
首先,item.tech -它必须是item.skill。
接下来,$gte……$in没有什么意义。$gte的意思是>=,大于或等于某物。如果你比较数字,“某物”一定是一个数字。如3 >= 5解析为false,3 >= 1解析为true。3 >= 1, 2 ,3,4,5没有任何意义,因为它将true解析为前3个元素,将false解析为最后2个元素。
最后,$elemMatch不是这样工作的。它测试数组的每个元素是否有匹配的所有条件。你试图写的是这样的:找到一个文档,其中技能数组有一个子文档,技能匹配数组中的至少一个,级别大于...某物。即使$gte条件是正确的,$elementMatch和$in的组合也不会比常规的$in做得更好:
{
skill: { $in: skills.map(item => item.tech) },
level: { $gte: ??? }
}如果您希望找到具有特定级别或更高技术技能的候选人,则每个技能级别对都应该满足$or条件:
const conditions = {$or:
skills.map(s=>(
{skill: { $elemMatch: {
skill:s.skill,
level:{ $gte:s.level }
} } }
))
};https://stackoverflow.com/questions/62047562
复制相似问题