ArangoDB查询返回带有音调符号标记的额外项

i2byvkas  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(175)

我有一个与变音符号有关的问题。为了简单起见,让我们假设,我有一个文档集合“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",
    "_id": "c/37070873",
    "_rev": "_bHsOMnm---",
    "uri": "/c/de/aerotropismus/"
  }
]
s4chpxco

s4chpxco1#

这确实像是一个bug:

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中创建一个用户定义的函数来对字符串数组进行排序。
更多阅读:

  • 注册AQL用户函数
    解决方法实施

您可以在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")

它将只返回您提供的数据集的一条记录。

相关问题