#arangodb
#arangodb
Вопрос:
Я хочу создать уникальное ребро между коллекциями документов C1 и C3.
Уникальным ограничением является id и kid.
Я использую flow aql для его создания, но я получаю более одного ребра с одним и тем же идентификатором и дочерним элементом.
как я могу этого добиться? извините за мой плохой английский 🙂
for i in C1
filter i.id != null and i.id != ''
let exist = first(
for c in C2
filter i.id == c.id and i.kid == c.kid
limit 1
return c
)
filter exist == null
let result = first(
for h in C3
filter i.kid == h.kid
limit 1
return h
)
insert{_from:i._id, _to:result._id, id:i.id, kid:i.kid} INTO C2
Комментарии:
1. Если комбинация id и kid уникальна (как вы упомянули в своем сообщении), то простое соединение между C1 и C3 должно дать вам то, что вам нужно. Если вы получаете дубликаты, это означает, что id и kid сами по себе недостаточно уникальны, и вам либо нужно использовать другие, более уникальные атрибуты, либо вам нужно сначала очистить c1 и c3.
Ответ №1:
Мой английский тоже не очень хорош ^)! Но я думаю, что я вижу, где вы допустили ошибки. Во-первых, для ваших двух коллекций вы можете использовать этот код:
LET data = [
{"parent":{"ID":"YOU_MUST_WRITE_HERE_ID_C1"},"child":{"KID":"YOU_MUST_WRITE_HERE_KID_C3"}},
{"parent":{"ID":"YOU_MUST_WRITE_HERE_NEXT_ID_C1"},"child":{"KID":"YOU_MUST_WRITE_HERE_NEXT_KID_C3"}}
]
FOR rel in data
LET parentId = FIRST(
FOR c IN C1
FILTER c.GUID == rel.parent.ID
LIMIT 1
RETURN c._id
)
LET childId = FIRST(
FOR c IN C3
FILTER c.GUID == rel.child.KID
LIMIT 1
RETURN c._id
)
FILTER parentId != null AND childId != null
INSERT { _from: childId, _to: parentId } INTO C2
RETURN NEW
Я надеюсь, что это поможет вам.
Второй — Почему вы используете коллекцию С2 в этом фрагменте?
let exist = first(
for c in C2