2

我正在尝试计算一个查询以根据可过滤选项、颜色、大小等过滤掉产品

用例:获取所有尺寸为 8 且红色的产品

尝试 1:使用交叉点

FOR product IN products
    FILTER product.options != null

    FOR productOption IN product.options
        FILTER productOption.option == "Size" AND LENGTH( INTERSECTION( productOption.value, ["8","14","16"] ) ) > 0
            AND productOption.option == "Color" AND LENGTH( INTERSECTION( productOption.value, ["Red"] ) ) > 0

RETURN product

尝试 2:使用多个过滤器

FOR product IN products
    FILTER product.options != null

    FOR productOption IN product.options
        FILTER productOption.option == "Size"
            FOR productSizeOptionValue IN productOption.value
                FILTER productSizeOptionValue IN ["8","10"]
        FILTER productOption.option == "Color"
            FOR productColorOptionValue IN productOption.value
                FILTER productColorOptionValue IN ["Red"]

RETURN product

我不确定我的想法是否应该遵循首先使用 LET 获得可能的候选产品而不是合并每个单独的 LET 查询的结果。显得比较笨拙!:(

4

1 回答 1

1

尝试 1 将不起作用,因为它在 上包含两个 AND 组合的 FILTER 条件productOption.option,具有不同的比较值:

...
FILTER 
       productOption.option == "Size" 
   AND LENGTH(INTERSECTION(...))
   AND productOption.option == "Color"
   AND LENGTH(INTERSECTION(...))
...

这是行不通的,因为option值不能同时是"Size"and "Color"

我认为将产品选项建模为单独的属性而不是使用通用选项数组可能更明智。如果一个产品对于每个不同的选项只能有一个值而不是多个,这将起作用。在这种方法中,产品看起来像这样:

{ "Size": "8", "Color": "Red", "HasWheels": true }

然后过滤产品属性变得更容易,例如

FOR product IN products
  FILTER product.Size IN [ "8", "10" ] 
     AND product.Color == "Red"
  RETURN product

然后搜索条件也可以进行 OR 组合,例如

  FILTER product.Size IN [ "8", "10" ] 
      OR product.Color == "Red"

这种方法将使查询更容易。但是它有一个缺点,那就是如果有许多不同的产品属性,由于内存限制,您将无法索引其中的大部分。如果不同的产品属性很少,或者如果所有搜索条件都使用一些具有足够选择性的通用属性,索引可以大大加快查找速度,这不是问题。

于 2015-10-23T13:47:25.930 回答