Arangodb 根据选项筛选出产品

Arangodb 根据选项筛选出产品,arangodb,aql,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.

我试图计算一个查询,根据可过滤选项、颜色、大小、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将不起作用,因为它在
productOption.option
上包含两个和组合的筛选条件,具有不同的比较值:

...
FILTER 
       productOption.option == "Size" 
   AND LENGTH(INTERSECTION(...))
   AND productOption.option == "Color"
   AND LENGTH(INTERSECTION(...))
...
这不起作用,因为
选项
的值不能同时是
的“大小”
的“颜色”

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

{ "Size": "8", "Color": "Red", "HasWheels": true }
然后对产品属性进行过滤变得更容易,例如

FOR product IN products
  FILTER product.Size IN [ "8", "10" ] 
     AND product.Color == "Red"
  RETURN product
然后,搜索条件也可以是或组合,例如

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

这种方法将使查询变得更容易。但它有一个缺点,即如果有许多不同的产品属性,由于内存限制,您将无法对其中的大多数属性进行索引。如果没有几个不同的产品属性,或者如果所有搜索条件都使用一些公共属性,则这不是问题至少,它们的选择性足以使索引大大加快查找速度。

尝试此操作,添加数组索引[0],因为我需要的是JSON数组而不是[[JSON]]结果。但是,我对实现感到不舒服。它们必须是更好/更可接受的方式…只是为了澄清一下,您建议我存储产品变体,即“选项”在单独的文档中以简化索引和数据检索?这似乎是可行的,但我还没有进行彻底的测试。将运行其他测试并确认。我不是有意建议。我是建议每个产品文档都包含自己的选项作为平面对象。例如,这可能是一个具有所有选项的产品
{“大小”:“8”,“颜色”:“红色”,“HasWheels”:true}
。这与您最初的问题相同,只是我没有将产品选项放入子属性
options
(这仍然适用于我的方法)在我的例子中,产品选项不是数组,而是文档的一级属性。感谢您的澄清。不幸的是,由于产品的复杂性以及如何构建当前前端来显示产品数据,这对当前用例不起作用。例如,{…,选项:[{…}],规范:[{…}],特性:[{…}每个属性都可以在过滤器中使用,以提取满足过滤条件的特定产品。我认为将这些额外属性存储为单独的文档是有意义的,这样产品文档就不会变大,同时也不会考虑内存限制。您可能要做的是,为每个产品使用一个文档,并拥有三个顶级文档其中的属性作为子文档,如下所示:
{…,“options”:{Size:“8”,“Color:“Red”},“specifications:{…},“features:{…}”
。由于您的产品定义过于复杂,因此不确定是否排除了这种情况,但可能仍然值得检查,因为这样可以简化查询。我将研究存储产品数据并恢复结果的选项。谢谢:)