C# MongoDB+;NoRM-并发和集合

C# MongoDB+;NoRM-并发和集合,c#,mongodb,linq,norm,nosql,C#,Mongodb,Linq,Norm,Nosql,假设我们有以下文档结构: class BlogPost { [MongoIdentifier] public Guid Id{get;set;} public string Body{get;set;} .... } class Comment { [MongoIdentifier] public Guid Id{get;set;} public string Body {get;set;} } 如果我们假设多个用户可能会对同一篇文章发表评论,那么对

假设我们有以下文档结构:

class BlogPost
{
   [MongoIdentifier]
   public Guid Id{get;set;}
   public string Body{get;set;}
   ....
}

class Comment
{
   [MongoIdentifier]
   public Guid Id{get;set;}
   public string Body {get;set;}
}
如果我们假设多个用户可能会对同一篇文章发表评论,那么对这些评论之间的关系进行建模的最佳方法是什么

如果Post有一组注释,我可能会遇到并发问题,不是吗


在评论上放置一个类似FK的属性似乎太过相关,或者?

他们给出了一个如何建模的示例-我认为您希望将一组评论作为属性公开在您的帖子上。您可以向给定的Post实体添加注释,这样就不用将注释实体绑定回其父Post实体,正如您有权质疑的那样,这在RDBMS中是有意义的,但在NoSQL解决方案中却没有这么多


就并发性而言,如果您不信任Mongo来为您处理这个问题,这可能是一个很大的提示,您不应该在它上面构建应用程序。

他们给出了一个示例,说明了您如何对它进行建模-我想您希望在您的帖子中将一组注释作为属性公开。您可以向给定的Post实体添加注释,这样就不用将注释实体绑定回其父Post实体,正如您有权质疑的那样,这在RDBMS中是有意义的,但在NoSQL解决方案中却没有这么多


就并发性而言,如果您不信任Mongo为您处理这一问题,这可能是一个很大的提示,您不应该在它上面构建应用程序。

我创建了一个测试应用程序,它产生了1000个并发线程,将“注释”添加到同一个“帖子”,结果是大量注释丢失

所以MongoDB将子集合视为单个值,默认情况下不会合并更改

如果我在帖子上有一个评论集合,那么当两个或多个用户同时添加评论时,我会遇到并发问题(不太可能,但可能)


那么,在不更新整个post对象的情况下,是否可以向post.comments集合添加注释呢?

我创建了一个测试应用程序,它生成了1000个并发线程,将“注释”添加到同一个“post”,结果是大量注释丢失

所以MongoDB将子集合视为单个值,默认情况下不会合并更改

如果我在帖子上有一个评论集合,那么当两个或多个用户同时添加评论时,我会遇到并发问题(不太可能,但可能)


那么,是否可以在不更新整个post对象的情况下向post.comments集合添加注释?

您基本上有两个选项:1。在post文档中聚合评论,或2。将post和评论建模为文档

如果您汇总评论,您应该a)在帖子上实现一个修订号,允许您检测竞争条件并实现乐观concurreny的处理,或者b)使用MongoDB修饰符添加新评论,例如

var posts = mongo.GetCollection<Post>();
var crit = new { Id = postId };
var mod = new { Comments = M.Push(new Comment(...)) };

posts.Update(crit, mod, false, false);
var posts=mongo.GetCollection();
var crit=new{Id=postId};
var mod=new{Comments=M.Push(new Comment(…)};
更新(暴击,修改,错误,错误);
如果将post和comment建模为单独的文档,那么处理并发性可能会更容易,但您将失去使用单个
findOne
命令加载post及其注释的能力


在我看来,(1)是迄今为止最有趣的选项,因为它将帖子建模为聚合对象,这正是当您戴上OO眼镜时的情况:)。这无疑是面向文档的方法,而(2)类似于关系数据库的平面结构。

基本上有两种选择:1。在post文档中聚合评论,或2。将post和评论建模为文档

如果您汇总评论,您应该a)在帖子上实现一个修订号,允许您检测竞争条件并实现乐观concurreny的处理,或者b)使用MongoDB修饰符添加新评论,例如

var posts = mongo.GetCollection<Post>();
var crit = new { Id = postId };
var mod = new { Comments = M.Push(new Comment(...)) };

posts.Update(crit, mod, false, false);
var posts=mongo.GetCollection();
var crit=new{Id=postId};
var mod=new{Comments=M.Push(new Comment(…)};
更新(暴击,修改,错误,错误);
如果将post和comment建模为单独的文档,那么处理并发性可能会更容易,但您将失去使用单个
findOne
命令加载post及其注释的能力


在我看来,(1)是迄今为止最有趣的选项,因为它将帖子建模为聚合对象,这正是当您戴上OO眼镜时的情况:)。这无疑是面向文档的方法,而(2)类似于关系数据库的平面结构。

这是一个规范的NoSQL示例。执行此操作的标准方法是将
注释
作为对象数组存储在
BlogPost

为了避免并发性问题,MongoDB提供了几种解决方案。特别是,有几种方法可以很好地处理“子文档”或“子数组”

对于类似“将此评论添加到帖子”的内容,您通常会使用
$push
命令将评论附加到帖子中


我看到你用的是“普通”司机。正如所证明的,看起来他们支持原子命令。事实上,他们的测试执行“将此评论推送到博客帖子上”。

这是典型的NoSQL示例之一。执行此操作的标准方法是将
注释
作为对象数组存储在
BlogPost

为了避免并发性问题,MongoDB提供了几种解决方案。特别是,有几种方法可以很好地处理“子文档”或“子数组”

对于类似“将此评论添加到帖子”的内容,您通常会使用
$push
命令将评论附加到帖子中

我看到你用的是“普通”司机。正如所证明的,看起来他们支持原子命令。事实上,他们的测试是有效的