在使用 _collections() 操作之前未定义边集合
Edges collection undefined until _collections() operation is used
我正在使用 ArangoDB 3.4.2,我遇到了一个我无法解释的奇怪问题...
我在 arangosh 中创建了一个图表(myGraph
):
var graph_module = require('@arangodb/general-graph');
var myGraph = graph_module._create('mygraph');
myGraph._addVertexCollection('vertexes');
var edges = graph_module._relation('edges', ['vertexes'], ['vertexes']);
myGraph._extendEdgeDefinitions(edges);
分别是vertexes
和edges
顶点和边的集合。
现在,我创建两个顶点:
db.vertexes.save({"name": "A", "_key": "A"});
db.vertexes.save({"name": "B", "_key": "B"});
到目前为止一切顺利。但是现在我尝试在两者之间创建边缘,但我失败了:
127.0.0.1:8529@myDB> db.edges.save("vertexes/A", "vertexes/B", {"name": "A-to-B"});
JavaScript exception: TypeError: Cannot read property 'save' of undefined
!db.edges.save("vertexes/A", "vertexes/B", {"name": "A-to-B"});
! ^
stacktrace: TypeError: Cannot read property 'save' of undefined
at <shell command>:1:9
似乎db.edges
未定义:
127.0.0.1:8529@MyDB> console.log(db.edges)
2019-01-26T19:01:52Z [98311] INFO undefined
但是现在,如果我 运行 db._collections()
似乎 db.edges
被定义了(奇怪!)
127.0.0.1:8529@MyDB> db._collections()
...
127.0.0.1:8529@MyDB> console.log(db.edges)
2019-01-26T19:02:58Z [98311] INFO [ArangoCollection 16807, "edges" (type edge, status loaded)]
此时,db.edges.save(...)
操作有效:
127.0.0.1:8529@MyDB> db.edges.save("vertexes/A", "vertexes/B", {"name": "A-to-B"});
{
"_id" : "edges/16899",
"_key" : "16899",
"_rev" : "_YGsKKq2--_"
}
为什么 db.edges
在第一个 save() 时未定义?为什么要定义显示集合操作(据我所知是只读的)?也许我做错了什么?
执行 db.edges.save()
时访问内部缓存。如果此缓存已清除,则执行 db.edges.save()
可以保存边缘。由于 db._collections()
重置了此缓存,因此之后可以 运行 命令。但是,如果此缓存不明确,则会像您观察到的那样抛出错误。
正确且安全的方法是通过db._collection("collection-name")
访问collection。
因此,您可以使用以下命令在 edges
collection 中保存一条边:
db._collection("edges").save("vertexes/A", "vertexes/B", {"name": "A-to-B"});
我正在使用 ArangoDB 3.4.2,我遇到了一个我无法解释的奇怪问题...
我在 arangosh 中创建了一个图表(myGraph
):
var graph_module = require('@arangodb/general-graph');
var myGraph = graph_module._create('mygraph');
myGraph._addVertexCollection('vertexes');
var edges = graph_module._relation('edges', ['vertexes'], ['vertexes']);
myGraph._extendEdgeDefinitions(edges);
分别是vertexes
和edges
顶点和边的集合。
现在,我创建两个顶点:
db.vertexes.save({"name": "A", "_key": "A"});
db.vertexes.save({"name": "B", "_key": "B"});
到目前为止一切顺利。但是现在我尝试在两者之间创建边缘,但我失败了:
127.0.0.1:8529@myDB> db.edges.save("vertexes/A", "vertexes/B", {"name": "A-to-B"});
JavaScript exception: TypeError: Cannot read property 'save' of undefined
!db.edges.save("vertexes/A", "vertexes/B", {"name": "A-to-B"});
! ^
stacktrace: TypeError: Cannot read property 'save' of undefined
at <shell command>:1:9
似乎db.edges
未定义:
127.0.0.1:8529@MyDB> console.log(db.edges)
2019-01-26T19:01:52Z [98311] INFO undefined
但是现在,如果我 运行 db._collections()
似乎 db.edges
被定义了(奇怪!)
127.0.0.1:8529@MyDB> db._collections()
...
127.0.0.1:8529@MyDB> console.log(db.edges)
2019-01-26T19:02:58Z [98311] INFO [ArangoCollection 16807, "edges" (type edge, status loaded)]
此时,db.edges.save(...)
操作有效:
127.0.0.1:8529@MyDB> db.edges.save("vertexes/A", "vertexes/B", {"name": "A-to-B"});
{
"_id" : "edges/16899",
"_key" : "16899",
"_rev" : "_YGsKKq2--_"
}
为什么 db.edges
在第一个 save() 时未定义?为什么要定义显示集合操作(据我所知是只读的)?也许我做错了什么?
执行 db.edges.save()
时访问内部缓存。如果此缓存已清除,则执行 db.edges.save()
可以保存边缘。由于 db._collections()
重置了此缓存,因此之后可以 运行 命令。但是,如果此缓存不明确,则会像您观察到的那样抛出错误。
正确且安全的方法是通过db._collection("collection-name")
访问collection。
因此,您可以使用以下命令在 edges
collection 中保存一条边:
db._collection("edges").save("vertexes/A", "vertexes/B", {"name": "A-to-B"});