2015-10-12 83 views
2

我试图计算查询以基于可筛选选项,颜色,大小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查询的结果。看起来相当笨拙! :(

+0

尝试这个http://pastebin.com/hzAsFbuQ,添加数组索引[0]因为我需要结果作为JSON数组而不是[[json]]。然而,我对实施感到不舒服。他们必须更好/更可接受的方式... – iswak

回答

1

尝试1不会工作,因为它包含两个AND-组合上productOption.option FILTER条件下,用不同的比较值:

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

这将不会工作,因为option值不能"Size""Color"

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

{ "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" 

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

+0

只是为了澄清,你建议我将产品变体又名“选项”存储在单独的文档中以简化索引和数据检索?这个http://pastebin.com/hzAsFbuQ似乎工作,但我还没有彻底测试。将运行额外的测试并确认。 – iswak

+0

我不是故意提出这个建议。我建议每个产品文档都包含自己的选项作为扁平物体。例如,这可能是一个产品,其所有选项为:{{Size}:“8”,“Color”:“Red”,“HasWheels”:true}。这和你原来的问题是一样的,除了我没有把产品选项放到一个子属性options中(这仍然可以和我的方法一起工作),在我的情况下,产品选项不是数组,而是文档的第一类属性。 – stj

+0

感谢您澄清。不幸的是,由于产品的复杂性以及如何构建当前前端来显示产品数据,所以对于当前用例来说不起作用。即{...,选项:[{...}],规格:[{...}],特征:[{...}]}可以在过滤器中使用每个属性来提取符合过滤条件的特定产品。我认为将这些额外属性存储为单独的文档是有意义的,因此产品文档不会变大,而且还会影响内存限制。 – iswak