MongoDB引用的最佳实践

我想知道使用引用进行建模的最佳实践是什么情况。 我正在使用MongoRepository库。

public class User : Entity { publis string Id { get; set; } public string Email { get; set; } public string Password { get; set; } } public class Post : Entity { public string Id { get; set; } public string Title { get; set; } public string Summary { get; set; } public DateTime Added { get; set; } public User Owner { get; set; } } 

存储post时我只想引用所有者(用户)对象而不是整个对象底层。

目前我这样做,不知道更好的方式……

 var post = new Post { Title = "Example title", Summary = "asd asd", Added = DateTime.Now, Owner = new User { Id = "someExistingUserId" } }; postRepository.Update(post); //Save 

..

 //Then to get the post var post = postRepository.GetById("previouslySavedPostId"); post.Owner = userRepository.GetById(post.Owner.Id); return post; 

userRepository和postRepository属于MongoRepository类型。

这是使用带有C#/ MVC(4)的MongoDB解决问题的正确方法吗?

您可以使用DBRef对象而不是User对象。

  public class Post : Entity { public string Id { get; set; } public string Title { get; set; } public string Summary { get; set; } public DateTime Added { get; set; } public DBRef Owner { get; set; } } 

然后你可以:

  var mongo = new Mongo(config.BuildConfiguration()); mongo.Connect(); var DB = mongo.GetDatabase(_dataBaseName) var post = new Post(); post.Owner = new DBRef("User", userId); //First parameter is a mongoDB collection name and second is object id //To fetch object referenced by DBRef you should do following var owner = DB.FollowReference(post.Owner); 

Mongo是一个文档数据库,如果你习惯使用sql server,它需要一种略微不同的思维方式。

由于您不希望在每个post中都有用户密码详细信息,我可能会这样做的方法是创建一个新类来包含显示post可能需要的任何用户信息。

 public class PostOwnerInfo { public string UserId { get; set; } public string Name { get; set; } } 

更新post实体,将Owner属性替换为PostOwnerInfo类型的OwnerInfo属性。

然后,当您创建新post时,请执行以下操作。

 var user = userRepository.GetById(someExistingUserId); var post = new Post { Title = "Example title", Summary = "Example summary", Added = DateTime.Now, OwnerInfo = new PostOwnerInfo { UserId = user.Id, Name = user.Name } }; postRepository.Update(post); 

这样,当您查询post时,它将具有您在其所有者信息属性中显示post所需的所有用户信息,而无需进一步查询。

 var post = postRepository.GetById(previouslySavedPostId); // post.OwnerInfo will contain user info 

有一定数量的数据冗余,但在文档数据库中,我就是这样做的。

如果您因任何原因需要完整的用户信息,只需像以前一样对其进行单独查询。

这个想法是您将post所需的所有用户信息存储在post的子文档中,因此您不需要为用户单独进行查询。

如果用户数据发生变化,只需更新用户发出的所有post上的UserInfo字段即可。

您的用户数据很少会更改,但您会经常查询post。