嵌套列表日期过滤器

问题描述 投票:0回答:2

在我的索引中,我有类型吸引力的文档,他们有一个属性,这是一个优惠列表。这些优惠有一个到期日。每个景点可以有多个优惠(优惠属性是优惠列表)。

我想要做的是过滤掉所有附加过期优惠的景点。

我到目前为止:

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

然而,这仅适用于第一个附加报价。我如何过滤所有附加的优惠?

c# elasticsearch nest
2个回答
0
投票

您可以在阵列上使用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;
    }

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

    }
© www.soinside.com 2019 - 2024. All rights reserved.