Ich versuche, eine verschachtelte Sammlung mithilfe der Patch-API zu aktualisieren. das folgende Beispiel Insbesondere betrachten - eine Posts Sammlung:RavenDB-Patch-API: Aktualisieren einer verschachtelten Sammlung
{
"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"
}
]
}
ich das Patch-API verwendet und Set-basierten Betrieb docs bei http://ravendb.net/docs/client-api/partial-document-updates und http://ravendb.net/docs/client-api/set-based-operations sowie mehrere Stackoverflow Fragen als Ressourcen, um eine Massenaktualisierung mit Set-Operationen zu tun und ein statischer Index. Eine Anforderung besteht darin, den "Titel" eines Kommentars nur dann zu aktualisieren, wenn der vorherige Wert "Nizza" war, und wenn dies der Fall ist, aktualisieren Sie ihn auf "Schlecht".
Die statischen Index "NicePosts" ist definiert als:
Map = posts => from post in posts
where post.Comments.Any(comment => comment.Title == "Nice")
select new {post.Title, post.Category}
Die Bulk-Patch-Update-Befehl ist:
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);
ich dies einige Fragen zu haben:
1) Ist mein Struktur/Syntax für den Update-Befehl korrekt?
2) Ich möchte, dass das Update für alle Datensätze in der Sammlung durchgeführt wird. Daher habe ich den Abfragefilter in der IndexQuery-Abfrage nicht definiert, da der "NicePosts" -Index die entsprechende Menge bereits zurückgibt. Wenn Sie diesen Befehl ausführen, wird die Auflistung jedoch nicht aktualisiert.
3) Wenn ich "allowStale: false" setze, bekomme ich einen "veralteten Index" -Fehler. Bevor ich meine Dokumentenspeicher-Sitzung öffne, instanziiere ich die Index-Klasse und führe sie aus, um sie in der ravenDB-Instanz zu erhalten. Irgendwelche Ideen, was hier falsch läuft?
Danke,
EDIT:
Basierend auf ayende Empfehlung geändert Patch-Befehl:
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);
Dank Ayende Ich bin nicht bewusst. Ich entfernte prevVal und fügte Position = 0 hinzu und behielt "new IndexQuery()", aber der Wert wird immer noch nicht aktualisiert. Gibt es noch etwas, das geändert werden muss? Ich habe den bearbeiteten Patch-Befehl im ursprünglichen Post hinzugefügt. – fjxx
Ich habe gerade "neue IndexQuery {}" verwendet und alles funktioniert jetzt. Vielen Dank ! – fjxx