mongoose子文档同时满足多个条件

我有一个架构与ResourceSkill ,和ResourceSkillLevel 。 前两个基本上只是名字,而后者则是对资源,技能和水平的参考。 我想同时select所有符合特定技能水平的Resource


架构

 // Omitting fields that don't matter for the purpose of the question ResourceSchema = new Schema({name: String}); SkillSchema = new Schema({name: String}); ResourceSkillLevelSchema = new Schema({ "resource": {type: Schema.ObjectId, ref: "Resource"}, "skill": {type: Schema.ObjectId, ref: "Skill"}, "level": {type: Number, min: 1, max: 5} }); 

问题

目前我有:

 ResourceSkillLevel.find({$and: [ {skill: "node.js", level: {$gte: 3}}, {skill: "mongodb", level: {$gte: 3}}, ]}) 

这将返回ResourceSkillLevel条目,但有两个问题:

  • 这个条件是不可能的,因为一个ResourceSkillLevel条目不能同时满足两个条件
  • 我想获得满足所有这些条件的Resource条目。 如果我有ResourceSkillLevel条目,我可以从他们那里获得Resource ,但是我确信有一个更简单的方法。

需求

如果你不明白,我需要的是一种方法来获得所有的Resource条目与所需的ResourceSkillLevel条目同时匹配。 也就是说,根据上面的查询,我应该能够得到一个在node.js mongodb中有4个的Resource ,但是不能获得在node.js中只有2个或没有任何一个技能级别的资源技能。

我的实现方式是改变模式如下:

 SkillSchema = new Schema({name: String, level: {type: Number, min: 1, max: 5}}); ResourceSchema = new Schema({name: String, Skills: [SkillSchema]}); 

我忘了mongoose是否允许embedded这样的模式…

那么你可以这样做一个查询:

 Resource.find({skills: [{"name": "nodejs", "level": 2},{"name": "mongodb", "level": 3}]}) 

这应该让你获得这个权利的大部分方法。


编辑显示更好的方式来做到这一点。

您可以将技能存储在自己的集合中,然后在资源模式中存储一组技能,但包含以下字段:

 SkillSchema = new Schema({name: String }); ResourceSchema = new Schema({name: String, Skills: [{skill_id: String, level: {type: Number, min: 1, max: 5}}]}); 

通过这种方式,您可以拥有单一的技能集合,然后引用资源中技能集合中的技能_id。

您的查询然后看起来像:

 Resource.find({skills: [{"skill_id": skill id from SkillSchema collection, "level": 2},{"skill_id": skill id from SkillSchema collection, "level": 3}]}) 

这应该适合你