如何使用ArangoJs在ArangoDb图表中存储文档?

时间:2015-11-29 20:13:29

标签: arangodb arangojs

我在nodejs应用程序中使用最新版本的ArangoDb和ArangoJs。我有两个顶点

  1. 用户
  2. 令牌
  3. tokens顶点包含users顶点中某个用户的安全令牌问题。我有一个名为token_belongs_to的边缘定义,将tokens连接到users

    如何使用ArangoJs存储属于现有用户的新生成的令牌?

2 个答案:

答案 0 :(得分:5)

我将假设您正在使用ArangoDB 2.7和最新版本的arangojs(撰写本文时为4.1),因为自驱动程序的3.x版本以来API已经发生了一些变化。

由于您没有提及使用Graph API,最简单的方法就是直接使用这些集合。但是,使用Graph API会增加诸如删除任何顶点时自动删除孤立边缘的好处。

首先,您需要获得对要使用的每个集合的引用:

var users = db.collection('users');
var tokens = db.collection('tokens');
var edges = db.edgeCollection('token_belongs_to');

或者如果您使用的是图谱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);
});

答案 1 :(得分:0)

注意-语法更改:

边缘创建:

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