内部文档的模式设计有助于搜索

时间:2013-12-13 15:25:28

标签: mongodb

我正在寻找有关如何处理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记录?

我没有正确设计架构吗?

2 个答案:

答案 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集合中嵌入UserNameUserSkills字段。从逻辑上看,技能不一定是个人独有的。用户可能具有多种技能,并且多个用户可能具有相同的技能,因此使UserIDUserName和该技能的属性毫无意义。

最好有两个集合,UsersSkills,并在用户文档中嵌套对技能的引用。您可以在Users.Skills子文档中索引键以使搜索更容易。