使用RavenDB进行一对多查询(&T) [英] "Traditional" one-to-many Query with RavenDB
本文介绍了使用RavenDB进行一对多查询(&T)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我知道RavenDB的include
-特性。它允许我在数据库的一次往返过程中立即获取引用的文档。但我的问题是:我首先获取的文档不包括对&Other&Quot;文档的引用。但其他";文档引用了当前文档。
想象一下我们在世界各地都有站点的设置。每个site
可能会触发各种警报。每个alarm
都引用了site
途径siteId
。
现在我想获得包括所有警报在内的所有站点的列表。但看起来,这在RavenDB中是不可能的?因为include
只接受site
文档中的";路径";,该文档保存引用文档的ID(或ID数组)。
site'-document and referencing this array in
include. But in contrast to a lot of examples featuring stuff like an
orderwith
lineItemswhere the order is a self contained thing, my
site`内提供一个数组alarmIds
来解决,该数组将运行数年,收集0到100万之间的任何警报。这对我来说似乎是个坏主意。
当然,我可以反过来:通过sitesId
查询所有警报和include
站点。但这不会返回没有警报的站点。
那么这只是我这边的一个设计错误吗?我误解了什么吗?或者,是否无法在一个查询中完成此操作并阻止一次查询?
推荐答案
public class A
{
public string Id { get; set; }
}
public class B
{
public string Id { get; set; }
public string A { get; set; }
}
public class MultiMapIndex : AbstractMultiMapIndexCreationTask<MultiMapIndex.Result>
{
public class Result
{
public string Id { get; set; }
public IEnumerable<string> Bs { get; set; }
}
public MultiMapIndex()
{
AddMap<A>(items => from a in items
select new Result {Id = a.Id, Bs = new string[0]});
AddMap<B>(items => from b in items
select new Result {Id = b.A, Bs = new[] {b.Id}});
Reduce = results => from result in results
group result by result.Id
into g
select new Result {Id = g.Key, Bs = g.SelectMany(r => r.Bs)};
}
}
[Fact]
public async Task TestCase()
{
using var store = GetDocumentStore();
await new MultiMapIndex().ExecuteAsync(store);
using (var session = store.OpenAsyncSession())
{
await session.StoreAsync(new B {A = "a/1"}, "b/0");
await session.StoreAsync(new A(), "a/1");
await session.StoreAsync(new A(), "a/2");
await session.SaveChangesAsync();
}
WaitForIndexing(store);
using (var session = store.OpenAsyncSession())
{
var results = await session.Query<MultiMapIndex.Result, MultiMapIndex>()
.Include(r => r.Bs)
.ToArrayAsync();
var before = session.Advanced.NumberOfRequests;
var bs = session.LoadAsync<B>(results[0].Bs);
Assert.Equal(before, session.Advanced.NumberOfRequests);
}
}
这篇关于使用RavenDB进行一对多查询(&T)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文