我正在尝试使用Patch API更新嵌套集合.更具体地说,请考虑以下示例 - Posts集合:
{
"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"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我在http://ravendb.net/docs/client-api/partial-document-updates和http://ravendb.net/docs/client-api/set-based-使用了Patch API和基于集合的操作文档.操作以及几个stackoverflow问题作为使用set操作和静态索引进行批量更新的资源.要求是仅在前一个值为"Nice"时更新注释的"Title",如果是,则将其更新为"Bad".
静态索引"NicePosts"定义为:
Map = posts => from post in posts
where post.Comments.Any(comment => comment.Title == "Nice")
select new {post.Title, post.Category}
Run Code Online (Sandbox Code Playgroud)
批量修补程序更新命令是:
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);
Run Code Online (Sandbox Code Playgroud)
我对此有一些疑问:
1)更新命令的结构/语法是否正确?
2)我希望对集合中的所有记录执行更新.因此,我没有在IndexQuery Query中定义查询过滤器,因为"NicePosts"索引已经返回了适当的集合.但是,运行此命令不会更新集合.
3)如果我设置"allowStale:false",我会收到"陈旧索引"错误.在打开我的文档存储会话之前,我实例化索引类并执行它以将其持久化到ravenDB实例.有什么想法在这里出错吗?
谢谢,
编辑:
基于ayende的建议将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);
Run Code Online (Sandbox Code Playgroud)
CMi*_*cea 10
现在可以使用脚本化修补程序请求来完成此操作:
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 },
},
}
);
Run Code Online (Sandbox Code Playgroud)