2012-05-14 27 views
7

Tôi đang cố cập nhật bộ sưu tập lồng nhau bằng cách sử dụng API bản vá. Cụ thể hơn, hãy xem xét ví dụ sau - một bộ sưu tập bài:RavenDB Patch API: cập nhật bộ sưu tập lồng nhau

{ 
    "Title": "Hello RavenDB", 
    "Category": "RavenDB", 
    "Content": "This is a blog about RavenDB", 
    "Comments": [ 
    { 
     "Title": "Unrealistic", 
     "Content": "This example is unrealistic" 
    }, 
    { 
     "Title": "Nice", 
     "Content": "This example is nice" 
    } 
    ] 
} 

tôi đã sử dụng API Patch và tài liệu hoạt động Set-dựa vào http://ravendb.net/docs/client-api/partial-document-updateshttp://ravendb.net/docs/client-api/set-based-operations cũng như một số câu hỏi stackoverflow như nguồn lực để làm một cập nhật hàng loạt sử dụng thiết lập hoạt động và một chỉ mục tĩnh. Yêu cầu là cập nhật "Tiêu đề" của nhận xét chỉ khi giá trị trước đó là "Tốt" và nếu có, hãy cập nhật nó thành "Xấu".

Chỉ số tĩnh "NicePosts" được định nghĩa là:

Map = posts => from post in posts  
       where post.Comments.Any(comment => comment.Title == "Nice") 
       select new {post.Title, post.Category} 

Phần lớn lệnh cập nhật bản vá là:

documentStore.DatabaseCommands.UpdateByIndex("NicePosts", 
        new IndexQuery(),            
      new[] { new PatchRequest 
        { Type = PatchCommandType.Modify,       
        Name = "Comments", 
         PrevVal = RavenJObject.Parse(@"{ ""Title"": ""Nice""}"), 
         Nested = new[] 
           { 
           new PatchRequest {Type = PatchCommandType.Set, Name = "Title", Value = new RavenJValue("Bad") }, 
         } }, allowStale: true); 

Tôi có một số câu hỏi về vấn đề này:

1) là của tôi cấu trúc/cú pháp cho lệnh cập nhật đúng?

2) Tôi muốn cập nhật được thực hiện trên tất cả các bản ghi trong bộ sưu tập. Do đó tôi đã không định nghĩa bộ lọc truy vấn trong QueryQuery Query vì chỉ mục "NicePosts" đã trả về tập hợp thích hợp. Tuy nhiên chạy lệnh này không cập nhật bộ sưu tập.

3) Nếu tôi đặt "allowStale: false", tôi nhận được lỗi "chỉ mục cũ". Trước khi mở phiên lưu trữ tài liệu của tôi, tôi khởi tạo lớp chỉ mục và Thực hiện nó để duy trì nó cho cá thể ravenDB. Bất kỳ ý tưởng whats đi sai ở đây?

Cảm ơn,

EDIT:

Dựa trên khuyến nghị Ayende đã thay đổi lệnh Patch:

documentStore.DatabaseCommands.UpdateByIndex("NicePosts", 
             new IndexQuery(), 
             new[] { 
                new PatchRequest { 
                Type = PatchCommandType.Modify, 
                Name = "Comments", 
                Position = 0, 
                Nested = new[] { 
                 new PatchRequest {Type = PatchCommandType.Set, Name = "Title", Value = new RavenJValue("Bad")}, 
                } 
                } 
               }, allowStale: false); 

Trả lời

3

Bạn không thể sử dụng lệnh patch để cập nhật giá trị dựa trên giá trị hiện tại mảng. Bạn cần chỉ định vị trí thực tế.

+0

Cảm ơn Ayende Tôi wasnt biết về nó. Tôi đã xóa prevVal và thêm Position = 0 và giữ "newQueryQuery()" nhưng giá trị vẫn chưa được cập nhật. Có điều gì khác cần thay đổi không? Tôi đã thêm lệnh vá đã chỉnh sửa trong bài đăng gốc. – fjxx

+0

Tôi vừa mới sử dụng "Chỉ mục mới {}" và mọi thứ hoạt động ngay bây giờ. Cảm ơn ! – fjxx

9

này bây giờ có thể được thực hiện bằng cách sử dụng scripted patch request:

string oldTitle = "Nice"; 
string newTitle = "Bad"; 

documentStore.DatabaseCommands.UpdateByIndex("NicePosts", 
    new IndexQuery(),            
    new ScriptedPatchRequest 
    {      
     Script = @"for (var i = 0; i < this.Comments.length; i++) 
         if (this.Comments[i].Title == oldTitle) 
          this.Comments[i].Title = newTitle;", 
     Values = 
     { 
      { "oldTitle", oldTitle }, 
      { "newTitle", newTitle }, 
     }, 
    } 
); 
+0

Tôi sẽ sử dụng một chỉ mục để truy vấn bằng tiêu đề bình luận để tăng tốc yêu cầu bản vá; truy vấn nhanh hơn để lọc tất cả các kết quả chỉ mục trong JS. – CMircea

+0

Đây phải là câu trả lời được chấp nhận – jolySoft

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