[英]ArangoDB Getting the Index of a Document
有没有一种方法可以获取ArangoDB中特定文档的索引,以便在LIMIT操作中使用它? 例如,假设我通过ID来查找Document并发现它的索引为534,那么我将像这样使用它:
LIMIT 534, 30
...并在查询完文件后返回下30个文件。 但是我似乎找不到使用AQL获取文档索引的方法...
问题是, 下一份文件应该真正意味着什么。
如果这里的下一个表示文档密钥索引顺序 :
文档在集合中没有特定的“顺序”或“索引”。 集合中的文档通过未排序的主索引中的_key
/ _id
属性进行组织。
要获得下一个文档键(假设按字典顺序排序的键),人们将必须阅读集合中的所有键,对其进行排序,并以某种方式找到当前文档的索引以获取下一个键。 这将是非常低效的。
集合上的其他索引是可选的,因此不能依赖于它们的存在和可用于此类查询。
如果这里的下一个意味着插入或更新命令,那么也没有明智的方法来获取下一个文档。
一种变通办法是在某个文档属性上使用排序(即,跳过列表)索引,最好是唯一的索引,并在每次插入文档时填充它(如果更新也应更改文档的顺序 ,则可以进行更新)。
然后查找下一个文档,执行以下操作:
首先通过其_id
或_key
找到所需的文档,然后将文档数据提取到应用程序中
提取具有排序索引的document属性,并在后续的AQL查询中使用它,如下所示
这将允许您查找原始文档之后的文档,但是,您必须以某种方式维护order属性:
FOR doc IN collection
FILTER doc.`order` > @value
LIMIT 0, 30
RETURN doc
如果您的文档具有某些可用于订购的属性,这将很容易做到,但如果文档不具有此类属性,这将是一个笨拙的解决方案。
如果您不应用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()
有极限地工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.