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

如何使用ArangoJs在ArangoDb图形中存储文档?,arangodb,arangojs,Arangodb,Arangojs,我使用的是来自nodejs应用程序的最新版本的ArangoDb和ArangoJs。我有两个顶点 使用者 代币 tokensvertex包含向usersvertex中的一个用户颁发的安全令牌。我有一个名为token\u所属的边定义连接tokens到用户 如何使用ArangoJs存储属于现有用户的新生成令牌?我假设您使用的是ArangoDB 2.7和ArangoJs的最新版本(撰写本文时为4.1),因为自3.x版本的驱动程序发布以来,API发生了一些变化 正如您没有提到的,最简单的方法是直接使用集合

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

  • 使用者
  • 代币
  • tokens
    vertex包含向
    users
    vertex中的一个用户颁发的安全令牌。我有一个名为
    token\u所属的边定义
    连接
    tokens
    用户


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

    我假设您使用的是ArangoDB 2.7和ArangoJs的最新版本(撰写本文时为4.1),因为自3.x版本的驱动程序发布以来,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');
    
    为了为现有用户创建令牌,您需要知道用户的
    \u id
    。文档的
    \u id
    由文档的集合名称(
    用户
    )和
    \u键
    (例如
    12345678
    )组成

    如果您没有
    \u id
    \u键
    ,也可以通过其他一些唯一属性查找文档。例如,如果您有一个知道其值的唯一属性
    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'});