2013-03-19 94 views
0

我是新来RavenDB和我有一个乌鸦的DB文件:RavenDB:儿童收集交叉口

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

+0

你有什么试过?请张贴一些代码。另外 - 为什么它在数据库中完成呢?你可以简单地找回两个学生,并自己做交点。你还没有解释为什么你需要一个数据库解决方案。你是以某种方式汇总这些结果吗?怎么样? – 2013-03-19 21:32:35

+0

@MattJohnson我需要用于分片的数据库解决方案,并且我拥有一个包含1500万个文档的数据集(我可以使用db解决方案像raven或mongo一样将它们分散到不同的机器上)。所以,必须在db级别执行此操作。我找不到在ravendb文档中如何在db级别执行此操作。 – 2013-03-19 22:06:39

+1

当然,您可能需要存储1500万个文档。你是否想要查询1500万个文档的交集?你的例子说你正在检索2.如果这是典型的,你应该只加载这两个文档,并在客户端linq(例如)自己做十字路口 – 2013-03-19 22:41:03

回答

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的更多信息。

+0

Matt谢谢你的答复。同样,如果1500万受访者分布在3台机器上3台机器上的查询是否并行执行?还是数据聚合到一个地方,然后查询被执行? – 2013-03-20 03:45:38

+0

它们并行运行,并使用分片合并策略合并结果。见http://ravendb.net/docs/server/scaling-out/sharding – 2013-03-20 04:13:25

+0

非常感谢马特。 – 2013-03-20 04:40:31