MongoDB引用的最佳实践

时间:2013-02-14 14:31:02

标签: c# asp.net-mvc mongodb mongodb-.net-driver

我想知道使用引用进行建模的最佳实践是什么情况。我正在使用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类型。

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

2 个答案:

答案 0 :(得分:22)

您可以使用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<User>(post.Owner);

答案 1 :(得分:11)

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

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

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

更新您的帖子实体,将所有者属性替换为PostOwnerInfo类型的OwnerInfo属性。

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

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

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

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

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

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

我们的想法是,您可以将帖子所需的所有用户信息存储在帖子的子文档中,这样您就不需要为用户进行单独的查询。

如果用户数据不稳定,只需更新用户发出的所有帖子的UserInfo字段。

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