2011-10-21 24 views
6

Tengo el siguiente documento denominado Reserva:¿Cómo consultar información anidada en 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" 
     }, 
     { 
      "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" 
} 

Además Tengo la siguiente clase de proyección:

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; } 
} 

¿Qué tipo de índice y consulta qué escribo si quiero encontrar los correspondientes ReservationItemProjections ? Ej .:

// invalid example query: 
var matches = docs.Query<ReservationItemProjection, 
    ReservationItemProjectionsIndex>() 
    .Where(x => 
     x.EmployeeId == "employees/1" && 
     x.StartTime >= minTime && 
     x.EndTime <= maxTime) 
    .ToList(); 

Tenga en cuenta, que no deseo para obtener una lista de los documentos de reserva, pero una lista de objetos ReservationItemProjection . El documentation dice:

Pero mientras que sólo conseguir los documentos que coincidan con una consulta en particular es útil, podemos hacer algo mejor que eso. En lugar de obtener los documentos ellos mismos, quiero obtener los valores directamente del índice, sin obtener el documento completo.

que ya han intentado usar un índice de esta manera:

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); 
    } 
} 

De alguna manera no puede obtener la consulta y el índice de trabajo: o bien se produce una excepción sobre no ser capaz de lanzar a partir de ReservationItemProjection Reserva o, cuando yo he podido obtener los objetos ReservationItemProjection, tendrán incluidos todos los artículos en todas las reservas que tengan incluso un elemento coincidente, incluso aunque mi consulta tiene la cláusula Where-x.EmployeeId == "employees/1 ".

Resumen: ¿Cuál es el índice requerido? ¿El índice solo necesita una cláusula Map o también Reduce o TransformResults? ¿Cómo escribo la consulta en C#?

Respuesta

8

Kasper, En RavenDB, está solicitando documentos. Si bien es técnicamente posible hacer lo que desea, generalmente no tiene sentido hacerlo, porque la información proyectada no tiene el contexto requerido para hacer algo con ella.

¿Qué es lo que estás tratando de hacer?

Como referencia, el índice sería algo así como:

from doc in docs.Items 
from reservation in doc.Reservations 
select new { reservation.EmployeeId, reservation.Start, reservation.End } 

Luego, marca EmployeeId, inicio y final como tienda.

Ahora, en su consulta, ejecuta:

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

La llamada AsProjection permitirá que el PP sabe que desea que los valores del índice, no el documento

+0

Esto dio exactamente el resultado que estaba buscando ¡para! ¿AsProjection se considera una función avanzada? Google solo devuelve dos páginas de resultados en [ravendb AsProjection] (http://www.google.com/search?q=ravendb+asprojection). Parece que la característica necesitaría algo de documentación? –

+0

Gracias, esta respuesta salve mi vida hoy! –

Cuestiones relacionadas