我正在寻找有关如何处理MongoDB设计问题的建议。 我有一个带有内部文档的用户文档。
public class User
{
public ObjectId Id {get;set;}
public string UserName {get;set;}
public List<Skills> SkillLists{get;set;}
public string xxxx {get;set;}
public string yyyy {get;set;}
public string zzzzz {get;set;}
}
public class UserSkills
{
public ObjectId Id {get;set;}
public ObjectId UserId {get;set;} // contains reference to UserId
public string UserName {get;set;}
public List<string> Skills {get;set;} This is just an array of strings to help me search
}
我正在保留一个单独的集合,以帮助我搜索具有特定技能的用户。 我的问题是,由于我的应用程序能够让用户更改用户名,我是否需要使用新用户名更新所有UserSkills记录?
我没有正确设计架构吗?
答案 0 :(得分:1)
从它的外观来看,你正试图将类似SQL的结构变为MongoDB。
一对多关系的MongoDB / NoSQL标准模型是通过嵌入子文档 http://docs.mongodb.org/manual/tutorial/model-embedded-one-to-many-relationships-between-documents/
如何在应用程序中创建类取决于您,但是存储层的地图可能希望用户看起来像这样:
您可能需要一个如下所示的文档:
{
_id: "...",
UserName: "Joe Bookreader",
Skill: [
{
Name: "Microsoft Word",
level: "Expert
},
{
Name: "Linux",
level: "Novice"
},
],
xxxx: "",
yyyy: "",
zzzz: ""
}
然后
db.users.find({“Skill.Name”:“Microsoft Word”})
返回整个文档。
这样,对用户名的更改对技能列表没有影响
答案 1 :(得分:0)
快速浏览一下,看起来不需要在UserID
集合中嵌入UserName
和UserSkills
字段。从逻辑上看,技能不一定是个人独有的。用户可能具有多种技能,并且多个用户可能具有相同的技能,因此使UserID
或UserName
和该技能的属性毫无意义。
最好有两个集合,Users
和Skills
,并在用户文档中嵌套对技能的引用。您可以在Users.Skills
子文档中索引键以使搜索更容易。