2012-05-14 17 views
7

Próbuję zaktualizować zagnieżdżoną kolekcję za pomocą interfejsu API Patch. Dokładniej, rozważmy następujący przykład - zbiór Posty:RavenDB Patch API: aktualizowanie zagnieżdżonej kolekcji

{ 
    "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" 
    } 
    ] 
} 

użyłem API plaster i ustawiona opartych docs pracy przy http://ravendb.net/docs/client-api/partial-document-updates i http://ravendb.net/docs/client-api/set-based-operations jak również kilka pytań stackoverflow jak zasoby zrobić zbiorczego aktualizacji za pomocą ustawionych operacji i indeks statyczny. Wymagane jest zaktualizowanie "tytułu" komentarza tylko wtedy, gdy poprzednia wartość była "niezła", a jeśli tak, zaktualizuj go do "złego".

statycznego indeksu "NicePosts" jest zdefiniowany jako:

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

Komenda bulk aktualizacja łata jest:

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

Mam kilka pytań dotyczących tego:

1) Is My struktura/składnia polecenia aktualizacji jest poprawna?

2) Chciałbym, aby aktualizacja została wykonana na wszystkich rekordach w kolekcji. Dlatego nie zdefiniowałem filtra zapytań w kwerendzie IndexQuery, ponieważ indeks "NicePosts" zwraca już odpowiedni zestaw. Jednak uruchomienie tego polecenia nie aktualizuje kolekcji.

3) Jeśli ustawię "allowStale: false", pojawi się błąd "nieaktualnego indeksu". Przed otwarciem sesji składowania dokumentów utworzę klasę indeksu i wykonam ją, aby utrzymać ją w instancji ravenDB. Jakieś pomysły, co tu jest nie tak?

Dzięki,

EDIT:

podstawie rekomendacji ayende zmienił polecenia patch do:

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

Odpowiedz

3

Nie można użyć polecenia poprawki do aktualizacji wartości w oparciu o istniejącą wartość w szyk. Musisz określić rzeczywistą pozycję.

+0

Thanks Ayende Nie byłem tego świadomy. Usunąłem prevVal i dodałem Position = 0 i zachowałem "new IndexQuery()", ale wartość nadal nie jest aktualizowana. Czy jest coś jeszcze, co należy zmienić? Dodałem edytowane polecenie łaty do oryginalnego postu. – fjxx

+0

Właśnie użyłem "nowego IndexQuery {}" i wszystko działa teraz. Dzięki ! – fjxx

9

ten można teraz zrobić za pomocą 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

Chciałbym użyć indeksu do zapytania przez tytuł komentarza, aby przyspieszyć żądanie poprawki; szybciej jest zapytać niż filtrować wszystkie wyniki indeksu w JS. – CMircea

+0

To powinna być zaakceptowana odpowiedź – jolySoft

Powiązane problemy