在我的索引中,我有具有吸引力类型的文档,它们具有一个属性,该属性是要约列表。这些报价有有效期。每个景点可以包含一个以上的要约(要约属性是要约列表)。
我想做的是过滤掉所有附有所有过期优惠的吸引力。
我已经走了这么远:
private QueryContainer AddExpiredOffersFilter(QueryContainerDescriptor<AttractionDocument> query)
{
query.DateRange(d => d.Field(f => f.Offers.First().Expires).GreaterThan(DateTime.Now));
return query;
}
但是,仅适用于第一个附加报价。我将如何过滤所有附加的报价?
答案 0 :(得分:0)
您可以在数组上使用最大值,并将其与Datetime.now进行比较。
重要提示:请注意,.First()并不仅意味着第一项(此外,弹性不会使索引动作中的项顺序保持不变)。对整个数组进行了分析(但实际上,.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;
}
答案 1 :(得分:0)
好的,经过一些试验,我可以正常工作了,忘了提一下,如果未设置有效期限,我也需要忽略
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)
)
)
);
}