2011-10-21 23 views
6

Tôi có tài liệu gọi là Reservation sau:Làm thế nào để truy vấn thông tin lồng nhau trong 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" 
} 

Bên cạnh đó tôi đã lớp chiếu sau:

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

Những loại chỉ số và truy vấn để tôi viết nếu tôi muốn tìm phù hợp với ReservationItemProjections ? Ví dụ .:

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

Xin lưu ý, rằng tôi không muốn để có được một danh sách các tài liệu Reservation nhưng một danh sách các đối tượng ReservationItemProjection. documentation nói:

Nhưng khi chỉ nhận được tài liệu phù hợp với truy vấn cụ thể là hữu ích, chúng tôi có thể làm tốt hơn thế. Thay vì tự nhận tài liệu, tôi muốn lấy các giá trị trực tiếp từ chỉ mục mà không nhận được tài liệu đầy đủ.

Tôi đã cố gắng sử dụng một chỉ số như thế này:

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

Bằng cách nào đó tôi không thể nhận các truy vấn và chỉ số làm việc: nó hoặc ném một ngoại lệ về không thể đúc từ ReservationItemProjection để Đặt trước hoặc, khi tôi có thể nhận các đối tượng ReservationItemProjection, chúng sẽ có bao gồm tất cả các mục trong tất cả các đặt chỗ thậm chí có một mục phù hợp, thậm chí mặc dù truy vấn của tôi có nhân viên x.EmployeeId == "ở đâu đó/1 ".

Tóm tắt: chỉ số được yêu cầu là gì? Liệu chỉ mục chỉ cần một mệnh đề Map hay cũng là Reduce hoặc TransformResults? Làm cách nào để viết truy vấn trong C#?

Trả lời

8

Kasper, Trong RavenDB, bạn đang truy vấn tài liệu. Mặc dù về mặt kỹ thuật, bạn có thể thực hiện những gì bạn muốn, nhưng thường là vô nghĩa khi làm như vậy, vì thông tin dự kiến ​​không có ngữ cảnh cần thiết để làm điều gì đó với nó.

Bạn đang cố gắng làm gì?

Để tham khảo, chỉ số sẽ là một cái gì đó như:

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

Sau đó, đánh dấu EmployeeID, Bắt đầu và Kết thúc như Store.

Bây giờ, trong truy vấn của bạn, vấn đề:

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

Cuộc gọi AsProjection sẽ cho DB biết rằng bạn muốn các giá trị từ các chỉ số, không phải là tài liệu

+0

này đã chính xác kết quả tôi đang tìm kiếm cho! AsProjection có được coi là một tính năng nâng cao không? Google chỉ trả về hai trang kết quả trên [ravendb AsProjection] (http://www.google.com/search?q=ravendb+asprojection). Có vẻ như tính năng này cần một số tài liệu? –

+0

Cảm ơn, câu trả lời này đã cứu mạng tôi hôm nay! –

Các vấn đề liên quan