RavenDB Patch API: обновление вложенной коллекции

Я пытаюсь обновить вложенную коллекцию с помощью 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);

7
задан fjxx 15 May 2012 в 13:20
поделиться