Indexing 如何在RavenDB中查询嵌套信息?

Indexing 如何在RavenDB中查询嵌套信息?,indexing,ravendb,Indexing,Ravendb,我有一份叫做预约的文件: { "CustomerId": 1, "Items": [ { "EmployeeId": "employees/1", "StartTime": "2011-08-15T07:20:00.0000000+03:00", "EndTime": "2011-08-15T07:40:00.0000000+03:00" }, {

我有一份叫做预约的文件:

{
    "CustomerId": 1,
    "Items": [
        {
            "EmployeeId": "employees/1",
            "StartTime": "2011-08-15T07:20:00.0000000+03:00",
            "EndTime": "2011-08-15T07:40:00.0000000+03:00"
        },
        {
            "EmployeeId": "employees/1",
            "StartTime": "2011-08-15T07:40:00.0000000+03:00",
            "EndTime": "2011-08-15T09:10:00.0000000+03:00"
        },
        {
            "EmployeeId": "employees/3",
            "StartTime": "2011-08-16T07:20:00.0000000+03:00",
            "EndTime": "2011-08-16T11:35:00.0000000+03:00"
        }
    ]
    "ReservedAt": "2011-10-20T15:28:21.9941878+03:00"
}
此外,我还有以下投影类:

public class ReservationItemProjection
{
    public string ReservationId { get; set; }
    public string CustomerId { get; set; }
    public string EmployeeId { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
}
如果要查找匹配项,我应该编写什么样的索引和查询 预订项目?例如:

// invalid example query:
var matches = docs.Query<ReservationItemProjection,
    ReservationItemProjectionsIndex>()
    .Where(x =>
        x.EmployeeId == "employees/1" &&
        x.StartTime >= minTime &&
        x.EndTime <= maxTime)
    .ToList();
请注意,我不希望获得预订文件列表,但希望获得 ReservationTemprojection对象的列表。报告说:

但是,尽管只获取与特定查询匹配的文档很有用,但我们可以做得更好。我希望直接从索引中获取值,而不是获取文档本身,而不获取完整文档

我已经尝试使用如下索引:

public class ReservationItemProjectionsIndex : 
    AbstractIndexCreationTask<Reservation, ReservationItemProjection>
{
    public ReservationItemProjectionsIndex()
    {
        Map = reservations => 
            from reservation in reservations
            from item in reservation.Items
            select new
            {
                ReservationId = reservation.Id,
                CustomerId = reservation.CustomerId,
                item.EmployeeId,
                item.StartTime,
                item.EndTime
            };
        Store(x => x.ReservationId, FieldStorage.Yes);
        Store(x => x.CustomerId, FieldStorage.Yes);
        Store(x => x.EmployeeId, FieldStorage.Yes);
        Store(x => x.StartTime, FieldStorage.Yes);
        Store(x => x.EndTime, FieldStorage.Yes);
    }
}
不知何故,我无法让查询和索引正常工作:它要么抛出一个异常 无法从ReservationTemprojection转换到Reservation,或者 如果能够获得ReservationTemprojection对象,则它们将 包括所有预订中甚至有一个匹配项目的所有项目,即使 尽管我的查询包含Where子句x.EmployeeId==employees/1

概要:所需的索引是什么?索引是否只需要Map子句,还是还需要Reduce或TransformResults?如何用C编写查询?

Kasper, 在RavenDB中,您正在查询文档。虽然从技术上讲,做你想做的事情是可能的,但这样做通常是毫无意义的,因为投射的信息没有必要的上下文来处理它

你想做什么

作为参考,该索引类似于:

 from doc in docs.Items
 from reservation in doc.Reservations
 select new { reservation.EmployeeId, reservation.Start, reservation.End }
然后,标记EmployeeId,开始和结束为Store

现在,在您的查询中,发布:

  session.Query<...,...>().AsProjection<ReservationProjection>().ToList();

AsProjection调用会让DB知道您想要的是索引中的值,而不是文档中的值

这正好是我想要的结果!投影是否被视为高级功能?谷歌只返回两页的搜索结果。似乎该功能需要一些文档?谢谢,这个答案今天救了我一命!