使用命名字段和集合查询 ravendb 索引
Querying ravendb index using named field and collection
我在 ravendb 中有以下索引,Changes_Which 是一个命名字段,它映射到一个子集合
public My_Index()
{
Map = revisions => from revision in revisions
from change in revision.Changes
where (revision.AuditedType == "typeA")
select
new
{
revision.ChangeTimestamp,
Changes_Which = change.Which
};
}
修订版的 json 看起来像:
{
"AuditedType" : "typeA",
"Changes": [
{
"SubWhich": null,
"Which": "Regulation",
"Original": "Unknown",
"New": "Yes"
},
{
"SubWhich": null,
"Which": "Other",
"Original": "Unknown",
"New": "Yes"
},
{
"SubWhich": null,
"Which": "Regulation",
"Original": "Unknown",
"New": "Yes"
}
]
"ChangeTimestamp": "2011-05-03"
}
我正在尝试使用 Changes_Which 字段从索引中过滤结果:
var q = session.Advanced.LuceneQuery<revision>("My_Index/Index")
.WaitForNonStaleResultsAsOfLastWrite()
.AddOrder(paging.SortColumn, paging.SortOrder == "desc")
.Skip(((paging.CurrentPage - 1) * paging.RecordsPerPage))
.Take(paging.RecordsPerPage);
if (fromDate > DateTime.MinValue && toDate > DateTime.MinValue)
{
q = q.WhereGreaterThanOrEqual("ChangeTimestamp", fromDate)
.AndAlso()
.WhereLessThanOrEqual("ChangeTimestamp", toDate.AddDays(1).AddMinutes(-1));
}
if (removeNoChange)
{
q = q.AndAlso().Not.WhereEquals("Changes_Which", "Regulation");
}
这一行:
q = q.AndAlso().Not.WhereEquals("Changes_Which", "Regulation");
有效,但仅删除 "Which" 上的第一个匹配项:"Regulation",集合中的第三个匹配项保留。
感谢任何建议。
这是因为您正在为同一文档输出不同的索引条目。
在 RavenDB 中搜索时,您正在搜索文档,在您的情况下,您过滤掉了该文档上的第一个索引条目,但还有其他匹配的索引条目,因此返回。
你可能会更好:
Map = revisions => from revision in revisions
where (revision.AuditedType == "typeA")
select
new
{
revision.ChangeTimestamp,
Changes_Which = revision.Changes.Select(chnage => change.Which)
};
这将只为每个文档输出一个条目(推荐)并将导致过滤所有因 Regulation
而更改的文档
我在 ravendb 中有以下索引,Changes_Which 是一个命名字段,它映射到一个子集合
public My_Index()
{
Map = revisions => from revision in revisions
from change in revision.Changes
where (revision.AuditedType == "typeA")
select
new
{
revision.ChangeTimestamp,
Changes_Which = change.Which
};
}
修订版的 json 看起来像:
{
"AuditedType" : "typeA",
"Changes": [
{
"SubWhich": null,
"Which": "Regulation",
"Original": "Unknown",
"New": "Yes"
},
{
"SubWhich": null,
"Which": "Other",
"Original": "Unknown",
"New": "Yes"
},
{
"SubWhich": null,
"Which": "Regulation",
"Original": "Unknown",
"New": "Yes"
}
]
"ChangeTimestamp": "2011-05-03"
}
我正在尝试使用 Changes_Which 字段从索引中过滤结果:
var q = session.Advanced.LuceneQuery<revision>("My_Index/Index")
.WaitForNonStaleResultsAsOfLastWrite()
.AddOrder(paging.SortColumn, paging.SortOrder == "desc")
.Skip(((paging.CurrentPage - 1) * paging.RecordsPerPage))
.Take(paging.RecordsPerPage);
if (fromDate > DateTime.MinValue && toDate > DateTime.MinValue)
{
q = q.WhereGreaterThanOrEqual("ChangeTimestamp", fromDate)
.AndAlso()
.WhereLessThanOrEqual("ChangeTimestamp", toDate.AddDays(1).AddMinutes(-1));
}
if (removeNoChange)
{
q = q.AndAlso().Not.WhereEquals("Changes_Which", "Regulation");
}
这一行:
q = q.AndAlso().Not.WhereEquals("Changes_Which", "Regulation");
有效,但仅删除 "Which" 上的第一个匹配项:"Regulation",集合中的第三个匹配项保留。
感谢任何建议。
这是因为您正在为同一文档输出不同的索引条目。 在 RavenDB 中搜索时,您正在搜索文档,在您的情况下,您过滤掉了该文档上的第一个索引条目,但还有其他匹配的索引条目,因此返回。
你可能会更好:
Map = revisions => from revision in revisions
where (revision.AuditedType == "typeA")
select
new
{
revision.ChangeTimestamp,
Changes_Which = revision.Changes.Select(chnage => change.Which)
};
这将只为每个文档输出一个条目(推荐)并将导致过滤所有因 Regulation