ArangoDB: фильтр по типу коллекции в запросе обхода
Я использую ArangoDB 2.8
Я делаю запрос обхода, который включает в себя 2 разные коллекции. Однако в моем результате я хотел бы получить только определенную коллекцию, но я не вижу способа фильтрации по имени коллекции.
В моем случае у меня есть address
коллекция и user
коллекция. В address
Коллекция Я различаю 3 уровня как: {addressType: штат}, {addressType: город} и {addressType: улица}. Тогда у меня есть преимущество, которое связывает address
в user
коллекция (штат> город> улица> пользователь). Я хочу сделать обход (как в коде ниже) из address
(любого типа) в user
(если есть) и возвращает только коллекцию типа user
Например, если на улице нет ссылки на пользователя, верните пустую.
For p in TRAVERSAL(address, myEdge, @vertex_id, 'outbound', {paths:false})
RETURN p.vertex._id)
2 ответа
Другой ответ использует IS_SAME_COLLECTION
Функция, как намекает этот SO ответ:
FOR p IN TRAVERSAL(address, myEdge, @vertex_id, 'outbound', {paths:false})
FILTER IS_SAME_COLLECTION('user', p.vertex._id)
RETURN p.vertex._id)
или, так как TRAVERSAL
был удален в ArangoDB 3.0+ ( см. этот ответ и руководство по миграции), что-то вроде
FOR v IN 0..5 IN OUTBOUND @vertex_id myEdge
FILTER IS_SAME_COLLECTION('user', v._id)
RETURN v._id)
Ну, я должен был найти решение, так что вот мое (я знаю, не самое лучшее, но работал для меня):
То, что я делаю, это разделить _id
от "/"
и проверьте, находится ли первая часть (название коллекции) в ['user']
For p in TRAVERSAL(address, myEdge, @vertex_id, 'outbound', {paths:false})
FILTER (SPLIT(p.vertex._id, "/", 1)[0]) IN ['user']
RETURN p.vertex._id)