#arangodb
#arangodb
Вопрос:
Я очень новичок в arangodb, и мне это очень нравится, но я изо всех сил пытаюсь создать оператор запроса. У меня есть две коллекции (VA, VB) и граница между ними (EC), я хочу найти поиск Va с определенным фильтром (не по _id), а затем ВЕРНУТЬ документы (VB), подключенные (через EC), где EC имеет определенное свойство (например, active: true)
В документации я нашел только примеры, когда вершина уже известна. Заранее благодарю вас, Jnl
Комментарии:
1. ДЛЯ m В ФИЛЬТРЕ VA m.name == ‘некоторое имя’ ДЛЯ v, e, p В 1..1 ЛЮБОЙ m ГРАФ ‘namedGraph’ ФИЛЬТРУЕТ p.ребра [0].активный == true ВОЗВРАЩАЕТ v
Ответ №1:
Да, создание графика немного упрощает задачу, но вы все равно можете запросить его без использования графика.
Это пример, который будет работать только с использованием трех коллекций напрямую:
FOR va IN VA
FILTER va.name == 'Bob'
FOR e IN EC
FILTER e._from == va._id amp;amp; e.active == true
FOR vb IN VB
FILTER e._to == vb._id
RETURN vb
Если вы хотите использовать график, который выглядит так, как будто вы, возможно, тестировали его, тогда это сработает:
LET myOrigin = FIRST(FOR d IN VA FILTER d.name == 'Bob' RETURN d._id)
FOR v, e, p IN 1..1 OUTBOUND myOrigin GRAPH 'GD'
FILTER p.edges[0].active == true
RETURN p.vertices[1]
Следует отметить, что myOrigin
это должен быть _id, что означает при установке значения, которое вы используете FIRST(...)
при присвоении значения. Это гарантирует, что вы получите обратно одно значение (первое), а не массив.
Ваш пример также работает:
FOR m IN VA FILTER m.name == 'Bob'
FOR v, e, p IN 1..1 ANY m GRAPH 'GD'
FILTER p.edges[0].active == true
RETURN v
Следует отметить, что этот пример может соответствовать более чем одному документу (поскольку может быть .name == 'Bob'
несколько документов, и он вернет все узлы в VB
этом совпадении.
Если вы хотели, чтобы результаты показывали, какая запись в VA была связана с VB, и у вас была возможность иметь несколько совпадающих значений VA, это поможет вам:
FOR m IN VA FILTER m.name == 'Bob'
FOR v, e, p IN 1..1 ANY m GRAPH 'GD'
FILTER p.edges[0].active == true
RETURN {
origin: m,
connected_to: v
}
Если вы хотите очистить результаты, вы можете использовать UNSET, чтобы улучшить результаты:
FOR m IN VA FILTER m.name == 'Bob'
FOR v, e, p IN 1..1 ANY m GRAPH 'GD'
FILTER p.edges[0].active == true
RETURN {
origin: UNSET(m, '_key', '_rev'),
connected_to: UNSET(v, '_key', '_rev')
}
Он просто удаляет эти ключи из результатов, отправленных вам в запросе.
Существует так много способов извлечения данных, что простой просмотр разных примеров действительно может помочь получить представление об AQL.