首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongo按对象数组过滤文档

Mongo按对象数组过滤文档
EN

Stack Overflow用户
提问于 2020-05-28 00:01:30
回答 1查看 46关注 0票数 0

我必须通过对象数组来过滤候选文档。

在文档中,我有以下字段:

代码语言:javascript
复制
skills = [
  { _id: 'blablabla', skill: 'Angular', level: 3 },
  { _id: 'blablabla', skill: 'React', level: 2 },
  { _id: 'blablabla', skill: 'Vue', level: 4 },
];

当我发出请求时,我得到了其他技能数组,例如:

代码语言:javascript
复制
skills = [
  { skill: 'React', level: 2 },
];

因此,我需要构建一个查询来获取包含此技能和更高或更高级别的文档。

我尝试执行以下操作:

代码语言:javascript
复制
const conditions = {
  $elemMatch: {
    skill: { $in: skills.map(item => item.skill) },
    level: { $gte: { $in: skills.map(item => item.level) } }
  }
};

Candidate.find(conditions)...

第一个看起来很好用,但第二个不起作用。

有什么想法吗?

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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做得更好:

代码语言:javascript
复制
{
    skill: { $in: skills.map(item => item.tech) },
    level: { $gte: ??? }
}

如果您希望找到具有特定级别或更高技术技能的候选人,则每个技能级别对都应该满足$or条件:

代码语言:javascript
复制
const conditions = {$or: 
    skills.map(s=>(
        {skill: { $elemMatch: {
            skill:s.skill, 
            level:{ $gte:s.level }
        } } }
    ))
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62047562

复制
相关文章

相似问题

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