巢状清单日期筛选器

时间:2019-02-25 14:13:20

标签: c# elasticsearch nest

在我的索引中,我有具有吸引力类型的文档,它们具有一个属性,该属性是要约列表。这些报价有有效期。每个景点可以包含一个以上的要约(要约属性是要约列表)。

我想做的是过滤掉所有附有所有过期优惠的吸引力。

我已经走了这么远:

private QueryContainer AddExpiredOffersFilter(QueryContainerDescriptor<AttractionDocument> query)
{
    query.DateRange(d => d.Field(f => f.Offers.First().Expires).GreaterThan(DateTime.Now));
    return query;
}

但是,仅适用于第一个附加报价。我将如何过滤所有附加的报价?

2 个答案:

答案 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)
                )
            )
        );

    }