ArangoDB查询返回带有变音符号的其他项目

问题描述

我有一个与变音符号有关的问题。为了简单起见,我们假设有一个文档集合“ c”。我放了两个文件:

{"uri": "/c/de/aërotropismus/"},{"uri": "/c/de/aerotropismus/"}

如您所见,它们除了变音符号外几乎相同。

然后,我在“ uri”字段上创建一个持久索引。

在此之后,我进行查询:

for doc in c
  filter doc.uri >= "/c/de/aerotropismus/" and doc.uri < "/c/de/aerotropismus0"
  return doc

我希望此查询返回一个结果,但是我得到两个结果:

[
  {
    "_key": "37070873","_id": "c/37070873","_rev": "_bHsOMnm---","uri": "/c/de/aerotropismus/"
  },{
    "_key": "37070853","_id": "c/37070853","_rev": "_bHsO_m6---","uri": "/c/de/aërotropismus/"
  }
]

那是为什么?以及如何解决它,使其仅返回一个结果:

[
  {
    "_key": "37070873","uri": "/c/de/aerotropismus/"
  }
]

解决方法

这确实似乎是一个错误:

FOR doc IN c
    SORT doc.uri DESC
    RETURN KEEP(doc,['uri'])

结果:

[
  {
    "uri": "/c/de/aerotropismus/1"
  },{
    "uri": "/c/de/aërotropismus/"
  },{
    "uri": "/c/de/aerotropismus/"
  }
]

解决方法

您可以在ArangoDB内部创建用户定义的函数,以对字符串数组进行排序。

更多阅读内容:

解决方法实施

您可以在aragosh中执行以下代码来注册您的自定义函数:

const aqlfunctions = require("@arangodb/aql/functions");

function isBetween(elems,left,right) {
    const sorted = elems.sort();
    const leftIndex = sorted.findIndex((elem) => elem >= left);
    if (leftIndex === -1) {
        return [];
    }
    const rightIndexReversed = sorted.slice().reverse().findIndex((elem) => elem < right);
    if (rightIndexReversed === -1) {
        return [];
    }
    const rightIndex = sorted.length - rightIndexReversed - 1;
    if (leftIndex > rightIndex) {
        return [];
    }
    return sorted.slice(leftIndex,rightIndex + 1);
}

aqlfunctions.register("CUSTOM::IS_BETWEEN",isBetween,true);

您以后可以按以下方式运行AQL:

RETURN CUSTOM::IS_BETWEEN((FOR rec IN c RETURN rec.uri),"/c/de/aerotropismus/","/c/de/aerotropismus0")

对于您提供的数据集,它只会返回一条记录。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...