RavenDB:子集合交叉点

时间:2013-03-19 21:12:06

标签: nosql ravendb nosql-aggregation

我是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级别找不到任何如何执行此操作。

1 个答案:

答案 0 :(得分: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都没有这两个值。

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