Ребро вставки ArangoDB не существует

#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