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);
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
Właśnie użyłem "nowego IndexQuery {}" i wszystko działa teraz. Dzięki ! – fjxx