根据选项过滤掉产品

时间:2015-10-12 09:55:13

标签: arangodb aql

尝试根据可过滤的选项,颜色,尺寸,e.t.c来计算查询以过滤掉产品。

使用案例:获取所有大小为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查询的结果。看起来很笨拙! :(

1 个答案:

答案 0 :(得分:1)

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

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

这不起作用,因为option值不能同时为"Size""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"

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