我试图计算一个查询,根据可过滤的选项、颜色、大小等来过滤产品。
用例:获取所有大小为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查询的结果。看上去相当笨拙!
发布于 2015-10-23 13:47:25
尝试1将无法工作,因为它在productOption.option上包含两个和组合的筛选条件,具有不同的比较值:
...
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"这种方法将使查询更加容易。但是它有一个缺点,那就是如果有许多不同的产品属性,由于内存限制,您将无法对其中的大多数属性进行索引。如果很少有不同的产品属性,或者所有的搜索条件都使用一些具有足够选择性的公共属性,从而极大地加快了查找速度,这就不是问题。
https://stackoverflow.com/questions/33078237
复制相似问题