如何在ArangoDB中将Collection作为参数传递给用户定义的函数

khbbv19g  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(136)

我想计算一个图中一个节点的入度和出度,给定的顶点和边集合。下面是我写的代码。UDF函数代码:

require("@arangodb/aql/functions").register(
    "MYFUNCTIONS::VERTEX::INDEGREE", 
    function(vertex,edge, node) {
        "use strict";
        let db = require('@arangodb').db;
        let aql = require('@arangodb').aql;
        
        let query = aql` for t in ${edge} filter t._to == ${node} COLLECT WITH COUNT INTO length return length`;
        return db._query(query).toArray();
    }
);

当我调用如下所示的函数时,我得到一个错误“AQL:集合或数组应作为FOR循环的操作数;您指定了内容为“事务”的类型“字符串”(在优化ast时)
自定义项函数调用代码:'返回MYFUNCTIONS::VERTEX::INDEGREE(“账户”,“交易”,“账户/123”)');
其中Account是文档集合,Transaction是边缘集合,Account/123是图中的节点。

cngwdvgl

cngwdvgl1#

您必须传递一个集合,而不是集合的名称,这样才能正常工作(请参阅此处的文档:https://www.arangodb.com/docs/stable/foxx-guides-queries.html#using-collections)
使用db._collection(name)获取集合,修改用户函数:

require("@arangodb/aql/functions").register(
    "MYFUNCTIONS::VERTEX::INDEGREE", 
    function(vertex,edge, node) {
        "use strict";
        let db = require('@arangodb').db;
        let aql = require('@arangodb').aql;

        let edgeColl = db._collection(edge);
     
        let query = aql` for t in ${edgeColl} filter t._to == ${node} COLLECT WITH COUNT INTO length return length`;
        return db._query(query).toArray();
    }
);

一个小型工作测试示例(testcoll包含一个文档testdoc):

require("@arangodb/aql/functions").register(
  "MYFUNC::TEST", 
  function (coll, key) {
   let db = require('@arangodb').db;
   let aql = require('@arangodb').aql;
   let collo = db._collection(coll);
   let query = aql` FOR t IN ${collo} FILTER t._key == ${key} RETURN t`; 
   return db._query(query).toArray(); 
});

和美叫:

@_system> db._query(aql`RETURN MYFUNC::TEST("testcoll", "testdoc")`);
[object ArangoQueryCursor, count: 1, cached: false, hasMore: false]

[
  [
    {
      "_key" : "testdoc",
      "_id" : "testcoll/testdoc",
      "_rev" : "_e7-qE-m---",
      "name" : "test_doc"
    }
  ]
]

相关问题