ArangoDB AQL:查找顺序数据中的缺口

ArangoDB AQL:查找顺序数据中的缺口,arangodb,aql,Arangodb,Aql,我得到了构建一个应用程序的数据,该应用程序具有产品零件号形式的顺序数据:“000000”、“000001”、“000002”、“000010”、“000011”…。以前的应用程序是一个旧的MS Access数据库,在零件号生成器中没有任何间隙填充功能,因此“000002”和“000010”之间存在间隙(是的,它们也是字符串,但我可以使用它…) 我们可以继续基于最后一个值递增,忽略差距,但是,为了在命名方案中使用所有可用的数字,我们希望能够填补差距。我们的命名方案使用前两位数字描述“产品系列”,因

我得到了构建一个应用程序的数据,该应用程序具有产品零件号形式的顺序数据:
“000000”、“000001”、“000002”、“000010”、“000011”…
。以前的应用程序是一个旧的MS Access数据库,在零件号生成器中没有任何间隙填充功能,因此
“000002”
“000010”
之间存在间隙(是的,它们也是字符串,但我可以使用它…)

我们可以继续基于最后一个值递增,忽略差距,但是,为了在命名方案中使用所有可用的数字,我们希望能够填补差距。我们的命名方案使用前两位数字描述“产品系列”,因此:
[00]0000
将是与
[02]0000
不同的系列

我可以使用以下方法找到起始值和结束值:

let query = `
  LET first = (
    MIN(
      FOR part in part_search
        SEARCH STARTS_WITH(part.PartNumber, @family)
        RETURN part.PartNumber
    )
  )
  LET last = (
    MAX(
      FOR part in part_search
        SEARCH STARTS_WITH(part.PartNumber, @family)
        RETURN part.PartNumber
    )
  )
  RETURN { first, last }
`
上面的示例返回:
{first:“000000”,last:“000915”}

使用ArangoDB和AQL,我如何才能找到这些差距?我发现了一些SQL示例,但我觉得AQL的特性有点局限性


提前谢谢

首先,我认为获取最小/最大值的最佳选择是使用聚合:

用于零件中零件搜索
搜索从(part.PartNumber,@family)开始
收集x=1
第一次聚合=最小值(零件号),最后一次聚合=最大值(零件号)
返回{
第一:第一,,
最后:最后
}
但在试图寻找差距时,这并没有真正的帮助。您是对的-SQL有几个逻辑结构可以帮助您(比如使用变量和游标迭代),但即使这样,我也不鼓励使用这种模式

更好的方法可能是采用“蛮力”方法——使用本机方法(如
JOIN
)将包含现有数字的表与包含all数字的表进行比较,找出差异。以下是您在AQL中可以如何做到这一点:

让allNumbers=0..9999
让现有部分=(
对于part in part_搜索
搜索从(part.PartNumber,@family)开始
让childId=RIGHT(part.PartNumber,4)
返回到_编号(childId)
)
返回减号(所有数字、现有零件)
x..y
构造创建一个序列(一个数字数组),我们将其用作可能的完整数字集。然后,我们只想返回ID的“非家庭”部分(我称之为“孩子”),它需要是数字才能与前一组进行比较。然后,我们使用
减号
allNumbers
列表中删除
existingParts
的元素

需要注意的一点是,该查询将只返回零件号的“子”部分,因此您必须稍后将其连接回族号。或者,您也可以跳过字符串拆分,并通过创建列表获得“fancy”:

让allNumbers=TO_NUMBER(CONCAT(@family,'0000'))…TO_NUMBER(CONCAT(@family,'9999'))
让现有部分=(
对于part in part_搜索
搜索从(part.PartNumber,@family)开始
返回到零件号(零件号)
)
返回减号(所有数字、现有零件)