Коллекция краев не определена, пока не будет использована операция _collections () - PullRequest
0 голосов
/ 26 января 2019

Я использую ArangoDB 3.4.2, и у меня странная проблема, которую я не могу объяснить ...

Я создаю график (myGraph) в arangosh:

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 не определено при первом сохранении ()? Почему операция показа коллекций (которая, как я понимаю, доступна только для чтения) определяет ее? Может я что-то не так делаю?

1 Ответ

0 голосов
/ 13 февраля 2019

При выполнении db.edges.save() доступ к внутреннему кешу. Если этот кэш очищен, выполнение db.edges.save() работает для сохранения ребра. Так как db._collections() сбрасывает этот кеш, можно выполнить команду позже. Однако, если этот кэш не очищен, вы видите ошибку.

Правильный и безопасный способ - получить доступ к коллекции через db._collection("collection-name"). Поэтому вы можете использовать следующую команду для сохранения ребра в коллекции edges:

db._collection("edges").save("vertexes/A", "vertexes/B", {"name": "A-to-B"});
...