首页 > 解决方案 > 如何在从 arangodb 的边缘集合中获取数据时添加过滤条件

问题描述

我正在尝试根据条件从边缘集合中获取数据

在我的边缘集合中,我有如下数据

{
    _from: "rooms/1"
    _to: "users/1"
    type: "admin"
},{
    _from: "rooms/1"
    _to: "users/2"
    type: "member"
},{
    _from: "rooms/1"
    _to: "users/3"
    type: "member"
}

现在我只想获取管理员的用户信息。我尝试使用以下查询,但它返回空值

FOR r IN rooms
    FILTER r._key == 1
    let admins = (
        FOR u IN ANY r rooms_users
            FILTER rooms_users.type == "admin"
        RETURN u
    )
RETURN MERGE([r, {admin: admins [0]}])

提前致谢

标签: node.jsarangodb

解决方案


我看到三个小问题...

首先,该_key属性始终是一个字符串,因此您需要1在第一个过滤器中引用 。

其次,在“admins”子查询中,您不能过滤“rooms_users”,因为这是边缘集合的名称,而不是边缘文档的标识。要过滤边的属性,您需要在FOR语句中添加一个变量来识别边(e在本例中)- docs

最后,出于性能原因,我将图形查询从 更改ANYINBOUND并将其限制为1. 这意味着我们只会找到:(a)这个房间的管理员,并且不会在图表上上下遍历很长的方向来试图找到任何和所有文档(它实际上对我来说是一个循环并超时)。

FOR r IN rooms
    FILTER r._key == '1'
    LET admins = (
        FOR u,e IN 1 INBOUND r rooms_users
            FILTER e.type == 'admin'
            RETURN u
    )
    RETURN MERGE([r, { admin: admins[0] }])

推荐阅读