ArangoDB
NoSQLEn native multi-model database der kombinerer document, graph, og key-value data models i én unified query language.
Beskrivelse
ArangoDB er unik fordi den er en native multi-model database - i stedet for at vælge mellem document, graph, eller key-value database, får du alle tre i én. Data gemmes som JSON documents i collections, men du kan også definere edges (connections) mellem documents for at lave property graphs. Dette betyder du kan køre document queries, graph traversals, og key-value lookups alt sammen i samme database med samme query language (AQL - ArangoDB Query Language). AQL ligner SQL men med extensions til graph traversals og document manipulation. ArangoDB understøtter ACID transactions, sekundære indexes, full-text search, og geospatial queries. Den kan deployes som single-server eller distributed cluster med automatic sharding og replication. Foxxes er microservices der kører direkte i databasen og giver dig mulighed for at skrive custom APIs i JavaScript. ArangoDB's multi-model approach er perfekt til komplekse domæner hvor data naturligt har både hierarkiske (documents) og relationelle/network (graphs) strukturer.
Features
- •Multi-model (document, graph, key-value)
- •AQL query language
- •ACID transactions
- •Graph traversals
- •Full-text search
- •Geospatial queries
- •Foxx microservices
- •Distributed clustering
Query Eksempel
// ArangoDB Query Language (AQL)
// 1. Opret collections
db._create("users");
db._createEdgeCollection("follows");
db._create("posts");
// 2. Indsæt documents
db.users.insert({
_key: "peter",
name: "Peter Hansen",
email: "peter@email.dk",
age: 30
});
db.users.insert({
_key: "maria",
name: "Maria Nielsen",
email: "maria@email.dk",
age: 28
});
// 3. Opret edge (graph relation)
db.follows.insert({
_from: "users/peter",
_to: "users/maria",
since: "2024-01-01"
});
// 4. Document query (like MongoDB)
FOR user IN users
FILTER user.age > 25
SORT user.name ASC
RETURN user
// 5. Graph traversal
FOR vertex, edge, path IN 1..3 OUTBOUND "users/peter" follows
RETURN {
user: vertex.name,
connection: edge,
depth: LENGTH(path.edges)
}
// 6. Find friends of friends
FOR user IN users
FILTER user._key == "peter"
FOR friend IN 2..2 OUTBOUND user follows
FILTER friend._key != user._key
RETURN DISTINCT friend.name
// 7. JOIN-like query
FOR post IN posts
LET author = FIRST(
FOR user IN users
FILTER user._key == post.authorId
RETURN user
)
RETURN {
title: post.title,
authorName: author.name
}
// 8. Aggregation
FOR user IN users
COLLECT ageGroup = FLOOR(user.age / 10) * 10
AGGREGATE count = LENGTH(1)
RETURN {
ageGroup: ageGroup,
count: count
}
// 9. Shortest path (graph algorithm)
FOR path IN OUTBOUND SHORTEST_PATH
"users/peter" TO "users/anders"
follows
RETURN path
// 10. Full-text search
FOR doc IN FULLTEXT(posts, "content", "database")
RETURN doc
// JavaScript Driver
const { Database, aql } = require('arangojs');
const db = new Database({
url: 'http://localhost:8529'
});
db.useDatabase('mydb');
db.useBasicAuth('root', 'password');
// Insert document
const users = db.collection('users');
await users.save({
_key: 'john',
name: 'John Doe',
email: 'john@email.com'
});
// Query with AQL
const cursor = await db.query(aql`
FOR user IN users
FILTER user.age > ${25}
RETURN user
`);
const result = await cursor.all();
console.log(result);
// Create edge
const follows = db.collection('follows');
await follows.save({
_from: 'users/peter',
_to: 'users/john',
since: new Date().toISOString()
});
// Graph traversal
const traversal = await db.query(aql`
FOR vertex IN 1..2 OUTBOUND ${'users/peter'} follows
RETURN vertex.name
`);
const friends = await traversal.all();
console.log(friends);
// Transaction
const trx = await db.beginTransaction({
write: ['users', 'posts']
});
try {
await trx.step(() =>
users.save({ name: 'Transaction User' })
);
await trx.step(() =>
db.collection('posts').save({ title: 'Post' })
);
await trx.commit();
} catch (err) {
await trx.abort();
}
// Named graph creation
const graph = db.graph('social_network');
await graph.create({
edgeDefinitions: [{
collection: 'follows',
from: ['users'],
to: ['users']
}]
});
// Foxx microservice (runs in database)
// manifest.json
{
"name": "my-api",
"version": "1.0.0",
"engines": {
"arangodb": "^3.0.0"
}
}
// index.js
const { context } = require('@arangodb/locals');
const router = context.createRouter();
router.get('/users', (req, res) => {
const users = db._query(
'FOR user IN users RETURN user'
).toArray();
res.json(users);
});Anvendelsesområder
- •Social networks (users som documents, connections som graphs)
- •Recommendation engines
- •Fraud detection (graph analysis)
- •Content management med komplekse relationer
- •Knowledge graphs
Fordele
- ✓Én database for multiple data models
- ✓Kraftfuld graph traversal capabilities
- ✓Fleksibel query language (AQL)
- ✓ACID transactions across models
- ✓God performance til både document og graph queries
Ulemper
- ✗Mindre community end MongoDB eller Neo4j
- ✗Learning curve for AQL
- ✗Overhead fra multi-model support
- ✗Færre managed cloud offerings
- ✗Documentation kan være fragmenteret
Bedst til
- →Social networks med graph relationships
- →Fraud detection systems
- →Recommendation engines
- →Knowledge management systems
- →Master data management
Ikke anbefalet til
- ⚠Simple CRUD apps (overkill)
- ⚠Pure key-value workloads (brug Redis)
- ⚠Pure document storage (brug MongoDB)
- ⚠Pure graph (brug Neo4j hvis kun graph)
- ⚠Teams uden graph database erfaring