【问题标题】:Get IDs of nodes via the edge collection only仅通过边缘集合获取节点 ID
【发布时间】:2016-05-12 09:43:25
【问题描述】:

我正在编写一个应用程序,将外部数据存储在 ArangoDB 中,以便在应用程序内部进行进一步处理。假设我在这里谈论的是Photosets 中的Photos

由于使用的 API 的性质,我需要获取 Photosets 才能加载 Photos。在Photosets API 回复中,有一个Photo ID 列表,我稍后会使用它来获取Photos。所以我创建了一个名为photosInSets 的边缘集合,并将边缘存储在PhotosetsPhotos 之间,尽管Photos 还没有。

稍后,我需要获取所有需要的 Photos 的列表,以通过 API 加载它们。所有 ID 都是数字。目前,我使用以下 AQL 查询来获取所有必需的 Photos 的 ID:

FOR edge
IN photosInSets
RETURN DISTINCT TO_NUMBER(
  SUBSTITUTE(edge._from, "photos/", "")
)

但是...这看起来不是一个好的解决方案。我想(至少)摆脱字符串操作来删除集合名称。这样做的好方法是什么?

【问题讨论】:

  • 答案是否满足您的需求?如果没有,缺少什么?如果,你能把它标记为接受吗?

标签: arangodb


【解决方案1】:

找到这一点的一种方法是在photosInSets 边缘集合上加入照片集合。

尝试如下查询:

FOR e IN photoInSets
LET item = (FOR v IN photos FILTER e._from == v._id RETURN v._key)
RETURN item

这将photoInSets 中的_from 引用与photos 集合中的_id 连接起来,然后从photos 中提取_key,其中不会包含集合名称。

查看照片项目,您会看到有 _id、_key 和 _rev 作为系统属性。如果你想要一个字符串,可以使用 _key 值,没有必要实现你自己的唯一 id,除非你不能公开 _key 的迫切原因。

通过一些操作,您甚至可以返回一个对象数组,说明哪个 photo._key 是哪个 photoSet 的成员,您只需要有两个 LET 命令并返回两个结果。一个在看照片,一个在看照片集。

我不是 ArangoDB 的官方支持人员,但我很想知道他们是否有其他方法。

【讨论】:

  • 问题是...正如我所写的,照片还没有,photos 集合是空的。我使用上述查询来获取我需要获取的Photos 列表,因此我无法加入空集合。不过谢谢!
  • 好的,所以您正在创建照片集和照片,然后将它们之间的关系添加到照片集?为了在 photosInSets 中添加关系,您需要为该表提供有效的 _from 和 _to 值,因此 Photosets 条目和 photos 条目需要存在。
  • 我知道集合中照片的 ID,但仅此而已。所以我有足够的信息来创建边缘,但没有文档。好吧,我可以创建一个空的照片文档,然后再更新它……
  • 听起来你需要一些东西。查询获取 PhotoSets,查询获取照片,查询获取特定键的 PhotoSet 中的照片。如果有人查询 /api/photosets 他们会得到照片集的键。然后他们查询 /api/photos 并获得照片 ID。然后他们调用 /api/photosets/{photosetID}/add/{photoID} 并将该照片添加到 photosInSets 中,其中 ._from 是 {photosetID} 引用的照片集,._to 是 {photoID} 引用的照片。只有在实际将照片添加到 photoSet 时,才需要使用 photosInSets 边缘集合。
  • 请注意,在 ArangoDB 3.0(目前处于 alpha 版本)之前,边的 _from_to 属性是不可变的 - 因此一旦您编写了文档就不能修改它们。因此,您至少需要能够预测要指向的顶点的 ID。
猜你喜欢
  • 2021-10-11
  • 2012-06-03
  • 2013-07-29
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2021-02-08
  • 1970-01-01
相关资源
最近更新 更多