ArangoDB 查询 returns 带有变音符号的额外项目
ArangoDB query returns extra items with diacritic marks
我有一个与变音符号相关的问题。为了简单起见,假设我有一个文档集合“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
我希望此查询得到 return 个结果,但我得到两个结果:
[
{
"_key": "37070873",
"_id": "c/37070873",
"_rev": "_bHsOMnm---",
"uri": "/c/de/aerotropismus/"
},
{
"_key": "37070853",
"_id": "c/37070853",
"_rev": "_bHsO_m6---",
"uri": "/c/de/aërotropismus/"
}
]
这是为什么?我该如何修复它,使其 return 只有一个结果:
[
{
"_key": "37070873",
"_id": "c/37070873",
"_rev": "_bHsOMnm---",
"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")
对于您提供的数据集,它只会return一条记录。
我有一个与变音符号相关的问题。为了简单起见,假设我有一个文档集合“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
我希望此查询得到 return 个结果,但我得到两个结果:
[
{
"_key": "37070873",
"_id": "c/37070873",
"_rev": "_bHsOMnm---",
"uri": "/c/de/aerotropismus/"
},
{
"_key": "37070853",
"_id": "c/37070853",
"_rev": "_bHsO_m6---",
"uri": "/c/de/aërotropismus/"
}
]
这是为什么?我该如何修复它,使其 return 只有一个结果:
[
{
"_key": "37070873",
"_id": "c/37070873",
"_rev": "_bHsOMnm---",
"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")
对于您提供的数据集,它只会return一条记录。