1

Resource我有一个用,Skill和设置的模式ResourceSkillLevel。前两个本质上只是名称,而后者则有资源、技能和等级的参考。我想同时选择所有Resource符合特定技能水平的s。


架构

// 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条目匹配的所有条目的方法。也就是说,根据上面的查询,我应该能够得到一个Resource在 node.jsmongodb 中有 4 个的资源,但不能得到一个在 node.js 中只有 2 个或没有任何技能水平的资源一点也不。

4

1 回答 1

2

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

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

我忘记了猫鼬是否允许嵌入这样的模式......

然后你可以像这样进行查询:

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}]})

这应该适合你

于 2013-08-09T15:49:57.193 回答