Как хранить документы в графе ArangoDb, используя ArangoJs?
Я использую последнюю версию ArangoDb и ArangoJs из приложения nodejs. У меня есть следующие две вершины
- пользователи
- жетоны
tokens
вершина содержит проблемы с маркерами безопасности для одного из пользователей в users
вершина. У меня есть определение края с именем token_belongs_to
соединительный tokens
в users
Как сохранить вновь сгенерированный токен, принадлежащий существующему пользователю, с помощью ArangoJs?
1 ответ
Я предполагаю, что вы используете ArangoDB 2.7 с последней версией arangojs (4.1 на момент написания этой статьи), так как API немного изменился с момента выпуска драйвера 3.x.
Поскольку вы не упоминаете об использовании Graph API, самый простой способ - это просто использовать коллекции напрямую. Однако использование Graph API добавляет такие преимущества, как осиротевшие ребра, которые автоматически удаляются при удалении любой из их вершин.
Сначала вам нужно получить ссылку на каждую коллекцию, с которой вы хотите работать:
var users = db.collection('users');
var tokens = db.collection('tokens');
var edges = db.edgeCollection('token_belongs_to');
Или, если вы используете Graph API:
var graph = db.graph('my_graph');
var users = graph.vertexCollection('users');
var tokens = graph.vertexCollection('tokens');
var edges = graph.edgeCollection('token_belongs_to');
Чтобы создать токен для существующего пользователя, вам необходимо знать _id
пользователя. _id
документа состоит из названия коллекции (users
) и _key
документа (например, 12345678
).
Если у вас нет _id
или же _key
Вы также можете искать документ по другому уникальному атрибуту. Например, если у вас есть уникальный атрибут email
что вы знаете значение, вы могли бы сделать это:
users.firstExample({email: 'admin@example.com'})
.then(function (doc) {
var userId = doc._id;
// more code goes here
});
Далее вы захотите создать токен:
tokens.save(tokenData)
.then(function (meta) {
var tokenId = meta._id;
// more code goes here
});
Когда у вас есть userId и tokenId, вы можете создать ребро, чтобы определить связь между ними:
edges.save(edgeData, userId, tokenId)
.then(function (meta) {
var edgeId = meta._id;
// more code goes here
});
Если вы не хотите хранить какие-либо данные на краю, вы можете заменить пустой объект на edgeData
или просто напишите это как:
edges.save({_from: userId, _to: tokenId})
.then(...);
Таким образом, полный пример будет выглядеть примерно так:
var graph = db.graph('my_graph');
var users = graph.vertexCollection('users');
var tokens = graph.vertexCollection('tokens');
var edges = graph.edgeCollection('token_belongs_to');
Promise.all([
users.firstExample({email: 'admin@example.com'}),
tokens.save(tokenData)
])
.then(function (args) {
var userId = args[0]._id; // result from first promise
var tokenId = args[1]._id; // result from second promise
return edges.save({_from: userId, _to: tokenId});
})
.then(function (meta) {
var edgeId = meta._id;
// Edge has been created
})
.catch(function (err) {
console.error('Something went wrong:', err.stack);
});
Внимание - изменения синтаксиса:
Создание края:
const { Database, CollectionType } = require('arangojs');
const db = new Database();
const collection = db.collection("collection_name");
if (!(await collection.exists())
await collection.create({ type: CollectionType.EDGE_COLLECTION });
await collection.save({_from: 'from_id', _to: 'to_id'});
https://arangodb.github.io/arangojs/7.1.0/interfaces/_collection_.edgecollection.html#create