如何使用 ArangoJs 在 ArangoDb 图中存储文档?
How to store documents in an ArangoDb graph using ArangoJs?
我正在使用来自 nodejs 应用程序的最新版本的 ArangoDb 和 ArangoJs。我有两个顶点
- 用户
- 代币
tokens
顶点包含发给 users
顶点中的一位用户的安全令牌。我有一个名为 token_belongs_to
的边定义,连接 tokens
到 users
如何使用 ArangoJs 存储属于现有用户的新生成的令牌?
我假设您使用的是 ArangoDB 2.7 和最新版本的 arangojs(撰写本文时为 4.1),因为 API 自 3.x 发布以来发生了一些变化driver.
因为您没有提到使用 Graph API,最简单的方法是直接使用 collection。然而,使用图形 API 会增加一些好处,例如在删除任何顶点时自动删除孤立边。
首先,您需要获得对每个要使用的 collection 的引用:
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
由collection名称(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
});
如果您不想在边缘存储任何数据,您可以用空 object 代替 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
我正在使用来自 nodejs 应用程序的最新版本的 ArangoDb 和 ArangoJs。我有两个顶点
- 用户
- 代币
tokens
顶点包含发给 users
顶点中的一位用户的安全令牌。我有一个名为 token_belongs_to
的边定义,连接 tokens
到 users
如何使用 ArangoJs 存储属于现有用户的新生成的令牌?
我假设您使用的是 ArangoDB 2.7 和最新版本的 arangojs(撰写本文时为 4.1),因为 API 自 3.x 发布以来发生了一些变化driver.
因为您没有提到使用 Graph API,最简单的方法是直接使用 collection。然而,使用图形 API 会增加一些好处,例如在删除任何顶点时自动删除孤立边。
首先,您需要获得对每个要使用的 collection 的引用:
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
由collection名称(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
});
如果您不想在边缘存储任何数据,您可以用空 object 代替 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