对于满足给定条件的所有文档,我想修补这些文档中的字段。为此,我在LINQ Pad中编写了一个查询,它为我提供了所需文档的子集。
那是:
Session.Query<Movie>()
.Where(x => x.Status == "Released" && x.IsDeleted == false && x.ReleaseDate.Date < new DateTime(2012, 4, 3))
.Dump();
现在我有了文件清单。但我需要修改一个字段。为此我写了一个索引和补丁命令..我需要帮助来完成这个任务。
补丁码(不完整):
store.DatabaseCommands.UpdateByIndex("Movies/NewIndexName",
new IndexQuery { Query = "IsDeleted:false" },
new[]
{
new PatchRequest
{
Type = PatchCommandType.Modify,
Name = "Status",
Value = "Testing"
}
}, allowStale: false);
索引是
from doc in docs.Movies
select new { ReleaseDate = doc.ReleaseDate.Date, IsDeleted = doc.IsDeleted, Status =
doc.Status }
具体来说我的问题是..我的方法是正确的..如果是,如何在条件中添加多个条件..在哪里说Query =“IsDeleted:false”我可以在查询中添加更多的比较检查(比如上面的LINQ查询)?
编辑:(使用DANIEL LANG'S解决方案)
这会产生格式异常..输入字符串的格式不正确。
store.DatabaseCommands.UpdateByIndex("Movies/NewIndexName",
new IndexQuery
{
Query =
string.Format("Status:Released AND IsDeleted:false AND ReleaseDate:{* TO {0}}",
DateTools.DateToString(new DateTime(2012, 4, 3),
DateTools.Resolution.MILLISECOND))
},
new[]
{
new PatchRequest
{
Type = PatchCommandType.Modify,
Name = "Status",
Value = "TestingReleased"
}
}, allowStale: false);
答案 0 :(得分:4)
您可以像这样编写查询:
store.DatabaseCommands.UpdateByIndex("Movies/NewIndexName",
new IndexQuery { Query = "IsDeleted:false AND Status:Release" },
....
注意您始终可以在LINQ查询上调用ToString()
并查看在幕后生成的Lucene查询(或使用Fiddler并查看查询线)
Session.Query<Movie>()
.Where(x => x.Status == "Released" && x.IsDeleted == false && x.ReleaseDate.Date < new DateTime(2012, 4, 3))
.ToString()
答案 1 :(得分:4)
是的,您可以拥有多个条件并使用标准布尔运算将它们组合在一起。你实际上是在这里构建一个lucene查询,所以让我们看看这个网站,了解更多关于如何编写它们的信息:http://lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.html#Boolean%20operators
关于日期的事情是,raven将它们(作为其他所有东西)存储为字符串,并且它使用的格式是专门选择的,以启用范围查询和那种东西,所以它可能不是你所期望的......
因此,为了查询日期,您需要以特殊方式对其进行格式化。 Raven.Abstractions.Linq中有一个DateTools类,它有一个帮助的DateToString方法。
您可以像这样构建相同的查询:
(编辑4/27在字符串中添加额外的{})
Query =
string.Format("IsDeleted:false AND ReleaseDate:{{* TO {0}}}",
DateTools.DateToString(new DateTime(2012,4,3),
DateTools.Resolution.MILISECONDS))