0

我是 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 等数据库解决方案将它们分片到不同的机器上)。我必须在数据库级别执行此操作,并且在 RavenDB 文档中找不到任何如何在数据库级别执行此操作的方法。

4

1 回答 1

1

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

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 没有两个值。

您可以在文档中阅读更多关于交叉查询的信息。

于 2013-03-20T00:06:13.250 回答