使用文档数据库(noSQL)的基于集合的基本操作

使用文档数据库(noSQL)的基于集合的基本操作,nosql,ravendb,except,complement,rdms,Nosql,Ravendb,Except,Complement,Rdms,和大多数人一样,我来自和RDMS世界,试图了解noSQL数据库,特别是文档存储(因为我发现它们最有趣) 我试图理解如何使用文档数据库执行一些基于集合的操作(我正在玩RavenDB) 根据我的理解: 联合(与SQL联合一样)非常直接。另外 不同集合之间的联合(SQL连接)可以通过映射/减少来实现。这个 RavenDB神话书中给出的示例,带有注释 博客是一个好的开始 交叉可以使用以下多种技术执行: 从去规范化到创建“映射”或“链接” 如所述的文档(以及下面的聚合器示例)。在RDMS中,这将使用简单

和大多数人一样,我来自和RDMS世界,试图了解noSQL数据库,特别是文档存储(因为我发现它们最有趣)

我试图理解如何使用文档数据库执行一些基于集合的操作(我正在玩RavenDB)

根据我的理解:

  • 联合(与SQL联合一样)非常直接。另外 不同集合之间的联合(SQL连接)可以通过映射/减少来实现。这个 RavenDB神话书中给出的示例,带有注释 博客是一个好的开始
  • 交叉可以使用以下多种技术执行: 从去规范化到创建“映射”或“链接” 如所述的文档(以及下面的聚合器示例)。在RDMS中,这将使用简单的“内部联接”或“WHERE x In”来执行
  • 减法(相对补码)是我陷入困境的地方。在RDMS中,此操作只是一个“WHERE x NOT In”或一个“LEFT JOIN”,其中连接集为NULL
以现实世界为例,假设我们有一个RSS聚合器(如Google Reader),它拥有数百万条(如果不是数十亿条的话)RSS条目,其中有数千名用户,每个用户都在标记收藏夹,等等

在本例中,我们重点关注条目、用户和标签;其中标记充当用户和条目之间的链接

user {string id, string name /*etc.*/}
entry {string id, string title, string url /*etc.*/}
tag {string userId, string entryId, string[] tags} /* (favourite, read, etc.)*/
使用上述方法,可以很容易地使用标记在条目和用户之间执行交集。但我无法理解一个人将如何执行减法运算。例如,“返回所有没有任何标签的项目”或更令人生畏的“返回最近1000个没有任何标签的项目”

因此,我的问题是:

  • 你能给我指一些关于这件事的阅读材料吗
  • 你能分享一些关于如何完成任务的想法吗 高效地

注意:我知道使用文档数据库会失去查询灵活性,但肯定有办法做到这一点?

从RDBMS到文档数据库的转换并不完全顺利,可能需要对模型进行一些重构以使其达到最佳状态。这是由于这些技术的性质不同

Re。RavenDB中基于集合的操作,请参见:

疯狂, 您想要的东西在非关系数据库中确实不容易实现。 这主要是因为他们不会集中思考,并且与分布式计算有着紧密的联系。 例如,如果没有访问所有数据的权限,就无法真正实现高效的集合,这几乎意味着任何基于集合的操作都必须访问所有这些数据。 由于nosqldbs通常用于分布式场景,因此它们不能真正支持这一点。
具体来说,RavenDB允许在指定的集合上进行某些操作,但它主要基于独立文档的假设,这些文档与其他文档没有很强的关系,或者需要以相同的方式一起操作的文档。

不幸的是,您的回答并不能完全回答这个问题。您提供的链接指的是非常简单的操作。我要寻找的是一种使用文档存储处理两个集合之间的“不在”操作(减法或相对补码)的技术。在这个阶段,唯一明显的解决方案似乎是通过定制应用程序代码,这不会是完全有效的。鉴于ravenDB中的大量变化,这个评论有多正确?