ArangoDB adalah database hybrid (dokumen dan grafik). Aspek positifnya meliputi:
- AQL bahasa kueri yang kuat dan nyaman
- GABUNG (bahkan lebih kuat dari database relasional)
- replikasi dan sharding
- ACID (bekerja di cluster hanya dalam versi berbayar)
Fitur yang kurang penting, tetapi tidak kalah nyamannya:
- pencarian fuzzy
- Mesin layanan mikro Foxx dibangun ke dalam database
- bekerja dalam mode langganan untuk perubahan dalam database
Sejujurnya, saya juga akan mencatat kerugiannya:
- tidak ada ODM
- popularitas rendah (dibandingkan dengan MongoDB, misalnya)
Setelah menganalisis kapabilitas ArangoDB dan, terutama, setelah mengatasi kekurangan di versi terbaru (seperti penurunan performa yang tajam saat ukuran kumpulan RAM yang tersedia terlampaui) dan munculnya fitur baru (seperti pencarian fuzzy) , sekarang saatnya mengujinya dalam aplikasi nyata.
Kemampuan AQL (ArangoDB Query Language)
Salah satu pertanyaan utama yang membuat saya khawatir adalah apakah ekspresi AQL akan cukup untuk menjalankan berbagai kueri dalam aplikasi nyata. Dan akan bekerja tanpa ORM / ODM cukup nyaman.
Ada beberapa cara di ArangoDB untuk melakukan kueri data. Ada API berorientasi objek yang akrab bagi mereka yang bekerja dengan MongoDB, tetapi metode ini dianggap usang di ArangoDB dan penekanan utamanya adalah pada kueri AQL.
Kueri paling sederhana untuk satu koleksi terlihat seperti ini:
db.query({
query: `for doc in managers
filter doc.role == @role
sort doc.@field @order
limit @page * @perPage, @perPage
return doc`,
bindVars: { role, page, perPage, field, order },
});
, FOR, , , , role .
, . mongoose (MongoDB) populate(). ArangoDB AQL:
db.query({
query: `
for mall in malls
for city in cities
filter mall.cityId == city._key
return merge(mall, { city })
`,
bindVars: { },
});
INNER JOIN. , city , , SQL.
LEFT JOIN — LET:
db.query({
query: `
for city in cities
let malls=(
for mall in malls
filter mall.cityId==city._key
return mall
)
return merge(city, {malls})`,
bindVars: { },
});
malls array null. , LEFT JOIN SQL — , city, mall. mall . , . "" , SQL, , .
, . , , , , , SQL. - NoSQL , .
- ArangoDB . : _from _to. , . .
- . , update . . , .
: , . , Elacticsearch. . -, Elasticsearch. , , . , -, Elasticsearch , .
ArangoDB SEARCH VIEW :
await db.createAnalyzer('fuzzy_brand_search_bigram', {
type: 'ngram',
properties: { min: 2, max: 2, preserveOriginal: true },
features: ['position', 'frequency', 'norm'],
});
await db.createView('brandSearch', {
links: {
brands: {
includeAllFields: true,
analyzers: ['fuzzy_brand_search_bigram'],
},
},
});
:
db.query({
query: `
for brand in brandSearch
search NGRAM_MATCH(
brand.name,
@brandName,
0.4,
'fuzzy_brand_search_bigram'
)
filter brand.mallId == @mallId
return brand `,
bindVars: { mallId, brandName },
});
ODM?
, , , AQL, . , Sequelize (ORM ), - RAW .
, , , ODM. , ODM ArangoDB. ODM . , ODM , . , , , .
, , . . - PATCH , , , . . , -, . issue . , , . , . .
Dalam artikel saya , saya menjelaskan dan menerapkan perpustakaan saya. Saya menggunakannya dalam proyek nyata. Tentu saja ada saat-saat stres ketika ternyata kemampuan perpustakaan ini belum cukup. Tetapi sebagian besar telah diselesaikan. Jadi saya tetap mengajak mereka yang ingin mempromosikan teknologi ArangoDB untuk bekerjasama.
apapacy@gmail.com
15 Maret 2021