mongoose子文档同时满足多个条件
我有一个架构与Resource
, Skill
,和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}]})
这应该适合你