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)
Другие вопросы по тегам