【发布时间】:2017-03-30 19:48:51
【问题描述】:
在Indexing Related Documents 的示例 II 中,索引是按姓名和书名建立在作者之上的。相关实体如下所示:
public class Book {
public string Id { get; set; }
public string Name { get; set; }
}
public class Author {
public string Id { get; set; }
public string Name { get; set; }
public IList<string> BookIds { get; set; }
}
即只有Author 保存有关关系的信息。该信息用于构建所述索引。
但是,我将如何为 Books by Authors 构建索引(假设一本书可能有多个作者)?
编辑:
书/作者的类比到此为止。我将举一个更接近我实际用例的示例:
假设我们有一些与位置相关的任务:
public class Location {
public string Id { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
}
public class Task {
public string Id { get; set; }
public string Name { get; set; }
public string LocationId { get; set; }
public Status TaskStatus { get; set; }
}
我有一个端点将位置作为 GeoJson 提供给客户端中的地图视图。我想根据与它们关联的任务的状态为位置着色。该地图通常会显示 500-2000 个位置。
位置查询被实现为流式查询。
使用 Ayende 最初回答中指出的查询方法,我可能会执行以下操作:
foreach (var location in locationsInView)
{
var completedTaskIds = await RavenSession.Query<Task>()
.Where(t => t.LocationId == location.Id && t.TaskStatus == Status.Completed)
.ToListAsync();
//
// Construct geoJson from location and completedTaskIds
//
}
这会导致对 RavenDB 执行 500-2000 次查询,这似乎不正确。 这就是为什么我最初认为我需要一个索引来构建我的结果。
我从那以后读到 RavenDB 默认缓存所有内容,所以这可能不是问题。另一方面,在实施了这种方法后,我收到一个错误(“...此会话允许的最大请求数(30)...”)。
有什么好的方法可以解决这个问题?
【问题讨论】:
-
你可以这样吗?
.Where(t => locationsInView.Any(x=> x.Id == t.LocationId) &&....而不是 foreach? -
我试过了。但不是。我认为是因为 Raven 不能在内部执行任意 C#,所以
locationsInView.Any(...)不起作用。
标签: c# ravendb document-database