ArangoDB ist eine hybride Datenbank (Dokument und Grafik). Zu den positiven Aspekten gehören:
- leistungsstarke und bequeme Abfragesprache AQL
- JOIN (noch leistungsfähiger als relationale Datenbanken)
- Replikation und Sharding
- ACID (funktioniert im Cluster nur in der kostenpflichtigen Version)
Weniger wichtige, aber nicht weniger praktische Funktionen:
- ungenaue Suche
- In die Datenbank integrierte Foxx Microservices Engine
- Arbeiten Sie im Abonnementmodus für Änderungen in der Datenbank
Fairerweise werde ich auch die Nachteile bemerken:
- kein ODM
- geringe Popularität (zum Beispiel im Vergleich zu MongoDB)
Nach der Analyse der Funktionen von ArangoDB und insbesondere nach der Überwindung der Mängel in den neuesten Versionen (z. B. ein starker Leistungsabfall, wenn die Größe der verfügbaren RAM-Sammlung überschritten wird) und dem Auftreten neuer Funktionen (z. B. Fuzzy-Suche) Es ist Zeit, es in einer realen Anwendung zu testen.
AQL-Funktionen (ArangoDB Query Language)
Eine der Hauptfragen, die mich beunruhigten, war, ob die Ausdruckskraft von AQL ausreichen würde, um alle Abfragen in einer realen Anwendung auszuführen. Und funktioniert ohne ORM / ODM bequem genug.
In ArangoDB gibt es verschiedene Möglichkeiten, Daten abzufragen. Es gibt eine objektorientierte API, die denjenigen vertraut ist, die mit MongoDB arbeiten. Diese Methode wird jedoch in ArangoDB als veraltet angesehen, und der Schwerpunkt liegt auf AQL-Abfragen.
Die einfachste Abfrage für eine Sammlung sieht folgendermaßen aus:
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 . , , . , . .
In meinem Artikel habe ich meine Bibliothek beschrieben und implementiert. Ich habe es in einem echten Projekt verwendet. Natürlich gab es Momente des Stresses, in denen sich herausstellte, dass die Fähigkeiten dieser Bibliothek nicht ausreichten. Aber sie waren größtenteils gelöst. Deshalb lade ich immer noch diejenigen, die die ArangoDB-Technologie fördern möchten, zur Zusammenarbeit ein.
apapacy@gmail.com
15. März 2021