Apakah ada cara bersih untuk menukar nilai _to dan _from untuk tepi menggunakan AQL? Menurut dokumentasi Arango di Edges:

Untuk mengubah titik akhir tepi, Anda harus menghapus dokumen/tepi lama dan memasukkan yang baru. Bidang lain dapat diperbarui seperti pada koleksi default.

Jadi yang bisa saya buat adalah kueri yang terlihat seperti ini:

FOR edge IN edge_collection
    FILTER [some criteria]
    LET tempEdge = KEEP(edge, ATTRIBUTES(edge, true))
    LET newEdge = MERGE([{'_key':edge._key}, {'_from':edge._to}, {'_to':edge._from}, tempEdge])
    REPLACE newEdge IN edge_collection
    RETURN NEW

Untuk sedikit menjelaskan solusi saya sendiri, saya menggunakan fungsi ATTRIBUTES(edge, true) untuk mendapatkan nama semua Atribut di Edge, dan parameter true menghapus atribut internal (seperti _key, _id, _to, dll.). Baca lebih lanjut tentang ATTRIBUTES di sini.

Kemudian fungsi KEEP(edge, [attributes]) mengembalikan Dokumen baru yang hanya memiliki Atribut yang ditentukan dalam larik yang diberikan, yang berkat fungsi ATTRIBUTES dalam kasus ini, adalah segalanya kecuali bidang internal. Baca lebih lanjut tentang KEEP di sini.

Kemudian saya menggunakan fungsi MERGE untuk menggabungkan _key dari tepi asli, menukar nilai _to dan _from, dan semua atribut non-internal. Baca lebih lanjut tentang MERGE di sini.

Terakhir, saya menggunakan REPLACE yang menghapus tepi asli dan menambahkan yang baru, seperti yang dibutuhkan Arango. Baca lebih lanjut tentang REPLACE di sini.

Seperti yang saya katakan, ini tampaknya berhasil, tetapi MERGE khususnya terasa seperti cara yang salah untuk melakukan apa yang saya lakukan. Apakah ada cara yang lebih mudah untuk menetapkan nilai pada Obyek? Misalnya, sesuatu yang memungkinkan saya melakukan panggilan yang mirip dengan: tempEdge._from = edge._to?

1
Francis Bartkowiak 11 Mei 2021, 22:16

1 menjawab

Jawaban Terbaik

Ya, ada solusi yang lebih sederhana:

FOR edge IN edge_collection
    FILTER [some criteria]
    UPDATE edge WITH {_from: edge._to, _to: edge._from} IN edge_collection
    RETURN NEW

_from dan _to dapat diperbarui (berbeda dengan atribut sistem _id, _key dan _rev), jadi Anda tidak perlu mengganti keseluruhan dokumen. Dan karena UPDATE menggabungkan perubahan ke dalam dokumen yang ada, Anda hanya perlu menentukan nilai baru untuk _from dan _to.

2
mpoeter 12 Mei 2021, 07:32