在我的索引中,我有类型吸引力的文档,他们有一个属性,这是一个优惠列表。这些优惠有一个到期日。每个景点可以有多个优惠(优惠属性是优惠列表)。
我想要做的是过滤掉所有附加过期优惠的景点。
我到目前为止:
private QueryContainer AddExpiredOffersFilter(QueryContainerDescriptor<AttractionDocument> query)
{
query.DateRange(d => d.Field(f => f.Offers.First().Expires).GreaterThan(DateTime.Now));
return query;
}
然而,这仅适用于第一个附加报价。我如何过滤所有附加的优惠?
您可以在阵列上使用Max并将其与Datetime.now进行比较。
重要提示:请注意.First()并不仅仅意味着第一项(弹性不会保留indexaction中的项目顺序)。整个数组被分析(但实际上,.Field运算符是一个Or,所以不适用于你的情况,可以使用must_not bool父子句btw)。
private QueryContainer AddExpiredOffersFilter(QueryContainerDescriptor<AttractionDocument> query)
{
query.DateRange(d => d.Field(f => f.Offers.Max(r => r.Expires)).GreaterThan(DateTime.Now));
return query;
}
好吧,经过一些实验,我有一些工作,忘了提我还需要忽略如果没有设置失效日期
private QueryContainer AddExpiredOffersFilter(QueryContainerDescriptor<AttractionDocument> query)
{
return (
(
+query.Exists(d => d.Field(f => f.Offers.First().Expires))
&&
+query.DateRange(d => d
.Field(f => f.Offers.First().Expires)
.GreaterThanOrEquals(DateTime.Now)
)
)
||
(
!query.Exists(d => d
.Field(f => f.Offers.First().Expires)
)
)
);
}