【问题标题】:RavenDB : Child collection intersectionsRavenDB:子集合交叉点
【发布时间】:2013-09-10 19:41:06
【问题描述】:

我是 RavenDB 的新手,我有一个 Raven DB 文档:

Student
{
  Id : int
  Subjects : List<int>
}

我正在尝试编写查询以获取 id 为 1 的学生和 id 为 2 的学生的科目的交集

{
  ID : 1
  Subjects : {22, 23, 25}
}

{
  ID : 2
  Subjects : {22, 25 }
}

这些交叉点将是 {22,25} 在这种情况下,我还需要交叉点主题 2 的计数。

处理此类查询的最佳方法是什么?还有其他 NoSQL 解决方案可以更好地处理这种查询吗?另外,我正在尝试将学生集合缓存在内存中。

我需要一个支持分片的数据库,并且我有一个包含 1500 万个文档的数据集(我可以使用 Raven 或 Mongo 等数据库解决方案将它们分片到不同的机器上)。我必须在 db 级别执行此操作,但在 RavenDB 文档中我找不到任何如何在 db 级别执行此操作。

【问题讨论】:

  • 你试过什么?请发布一些代码。另外 - 为什么在数据库中完成它很重要?您可以简单地检索这两个学生并自己进行交叉。您还没有解释为什么需要数据库解决方案。您是否以某种方式汇总了这些结果?怎么样?
  • @MattJohnson 我需要用于分片的 db 解决方案,而且我有一个包含 1500 万个文档的数据集(我可以使用 raven 或 mongo 等 db 解决方案将它们分片到不同的机器上)。因此,必须在数据库级别执行此操作。我在 ravendb 文档中找不到任何如何在 db 级别执行此操作。
  • 当然,您可能需要存储 1500 万份文档。您还想查询 1500 万个文档的交集吗?您的示例说您正在检索 2。如果这是典型的,您应该只加载这两个文档并在客户端 linq 中自己进行交集(例如)
  • @MattJohnson 如果我有 1500 万学生分布在 3 台机器上。我需要所有参加科目 1 和科目 2 的学生。我假设如果它在 db 级别,则查询将传递给所有 3 台机器,并且在每台机器拥有的数据部分执行查询,结果减少回客户。
  • @MattJohnson 我假设这种查询可以使用 map/reduce 执行,结果由主题键入,值是学生 ID 列表。

标签: nosql ravendb nosql-aggregation


【解决方案1】:

根据您的 cmets(这不是您最初的问题),您可以执行以下查询:

var q = session.Query<Student>()
               .Where(x => x.Subjects.Any(y => y == 22))
               .Intersect()
               .Where(x => x.Subjects.Any(y => y == 25));

等效的 Lucene 查询是:

Subjects:22 INTERSECT Subjects:25

鉴于此数据:

Student { Id = 1, Subjects = new List<int> { 22, 23, 25 } }
Student { Id = 2, Subjects = new List<int> { 22, 25 } }
Student { Id = 3, Subjects = new List<int> { 23, 25} }
Student { Id = 4, Subjects = new List<int> { 22 } }

只会返回学生 1 和 2,因为 3 和 4 没有两个值。

您可以在文档中阅读有关Intersection Queries 的更多信息。

【讨论】:

  • 马特感谢您的回复。再次,如果 1500 万受访者分布在 3 台机器上,查询是否在 3 台机器上并行执行?还是将数据聚合到一个地方再执行查询?
  • 它们并行运行,并使用您的分片合并策略合并结果。见ravendb.net/docs/server/scaling-out/sharding
猜你喜欢
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多