Я пытаюсь обновить вложенную коллекцию с помощью Patch API. В частности, рассмотрим следующий пример — коллекция сообщений:
{
"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"
}
]
}
Я использовал документацию по Patch API и операции на основе набора по адресу http://ravendb.net/docs/client-api/partial-document-updatesи http://ravendb.net/docs/client-api/set-based-operations, а также несколько вопросов stackoverflow в качестве ресурсов для выполнения массового обновления с использованием операций над множествами и статического индекса. Требование состоит в том, чтобы обновить «Заголовок» комментария только тогда, когда предыдущее значение было «Хороший», и если это так, обновить его до «Плохого».
Статический индекс «NicePosts» определяется как:
Map = posts => from post in posts
where post.Comments.Any(comment => comment.Title == "Nice")
select new {post.Title, post.Category}
Пакетное исправление команда обновления:
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);
У меня есть несколько вопросов по этому поводу:
1) Правильна ли моя структура/синтаксис команды обновления?
2) Я бы хотел, чтобы обновление выполнялось для всех записей в коллекции .Поэтому я не определил фильтр запроса в запросе IndexQuery, потому что индекс «NicePosts» уже возвращает соответствующий набор. Однако выполнение этой команды не обновляет коллекцию.
3) Если я устанавливаю "allowStale:false", я получаю сообщение об ошибке "устаревший индекс". Перед открытием сеанса хранилища документов я создаю экземпляр класса индекса и выполняю его, чтобы сохранить его в экземпляре ravenDB. Любые идеи, что здесь происходит не так?
Спасибо,
РЕДАКТИРОВАТЬ:
По рекомендации Айенде изменена команда 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);