为引用MongoDB的最佳实践(MongoDB best practice for referenc

2019-07-19 21:02发布

我想知道什么用引用建模的最佳实践将下给定的情况。 我使用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; }
}

当存储后我想仅所有者(用户)对象,而不是整个对象底层参考。

目前我正在做这样的,不知道的更好的办法?

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类型。

这是正确的做法,以使用MongoDB的用C#解决我的问题/ MVC(4)?

Answer 1:

您可以使用DBREF对象,而不是用户对象。

    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<User>(post.Owner);


Answer 2:

蒙戈是文档数据库,如果你习惯使用的SQL Server它需要的思维方式略有不同。

当你不想在每一个岗位的用户密码的细节,这样我可能会做它是创建一个新的类,包括可能需要显示后的任何用户信息。

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

更新你的帖子的实体,与OwnerInfo属性替代型PostOwnerInfo的所有者财产。

然后,当你创建一个新的岗位,做到以下几点。

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);

这样,当你查询后,将有你需要显示后,在它的OwnerInfo不需要进一步查询属性中的所有用户信息。

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

有数据冗余一定量的,但在一个数据库文件,这是我应该怎样做。

如果您需要任何理由完整的用户信息只是为它做一个单独的查询,你做之前。

这个想法是,你把你需要的职位的子文件后的所有用户信息,所以你不应该需要为用户做一个单独的查询。

如果用户数据chages,只需更新由用户进行的所有帖子用户信息领域。

您的用户数据将很少改变,但你会经常查询的帖子。



文章来源: MongoDB best practice for referencing