ArangoDB获取文档索引

时间:2015-11-19 21:08:24

标签: indexof arangodb aql

有没有办法在ArangoDB中获取特定文档的索引,以便在LIMIT操作中使用它?例如,假设我通过它的ID查找Document并发现它的索引是534,那么我会像这样使用它:

LIMIT 534, 30

...并在我查找的文件后返回接下来的30个文件。但是我似乎无法找到使用AQL获取文档索引的方法...

2 个答案:

答案 0 :(得分:1)

问题是下一个文件究竟应该是什么意思。

如果 next 在这里表示文档键索引顺序

文件没有特别的"顺序"或"索引"在一个集合内。集合中的文档按其未排序的主索引中的_key / _id属性进行组织。

要获取下一个文档密钥(让我们假设按字典顺序排序的密钥),必须读取集合的所有密钥,对它们进行排序,然后以某种方式找到当前文档的索引以获取下一个密钥。这将是非常低效的。

集合上的其他索引是可选的,因此不能依赖它们存在并可用于此类查询。

如果 next 在这里意味着插入或更新订单,那么也没有合理的方法来访问下一个文档。

解决方法可能是在某个文档属性上使用已排序(即跳过列表)索引,理想情况下是唯一的,并且无论何时插入文档都会填充(如果更新也应更改订单,则可能会更新) / em>的文件)。

然后找到 next 文档,执行以下操作:

  • 首先通过_id_key找到所需文档,然后将文档数据提取到应用程序中

  • 获取具有已排序索引的文档属性,并在后续AQL查询中使用它,如下所示

这将允许您查找原始文档之后的文档,但是,您必须以某种方式维护订单属性:

FOR doc IN collection
  FILTER doc.`order` > @value
  LIMIT 0, 30
  RETURN doc

如果您的文档有一些可用于订购的属性,这将很容易做到,但如果他们没有这样的属性,那将是一个笨拙的解决方案。

答案 1 :(得分:0)

如果您不应用anny排序过滤器,ArangoDB不会等待特殊序列。

所以,做

db._create("testCollection");
for (var i = 0; i < 10; i ++) db.testCollection.save({which: i})
db._query("FOR i IN testCollection RETURN i.which").toArray()

会给你一个相当随机的序列。

db._query("FOR i IN testCollection SORT i.which RETURN i.which").toArray()

会给你一个很好的结果。

然后你可以这样做:

db._query("FOR i IN testCollection SORT i.which LIMIT 3, 5 RETURN i.which").toArray()

使用限制。

您也可以use cursorsfetch partial results