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-updates và http://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);
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
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