大约 1.) 这是正在进行中的工作,将包含在下一个版本之一中(很可能是 2.8)。
我们尚未决定检索数组的 AQL 语法,但FILTER "admin" IN P.groups 是最有可能的语法之一。
大约 2.) 已实现 1. 这也将开箱即用,索引将能够覆盖多个嵌套深度。
以上都不能在当前版本(2.6)中正确索引
我可以提供的唯一选择是将值外部化并使用边而不是数组。
在您的代码中,数据将如下(以 arangosh 格式)。
为简单起见,我使用了固定的 _key 值,没有它们也可以工作:
db._create("groups"); // saves the group elements
db._create("contacts"); // saves the contact elements
db._ensureHashIndex("value") // Index on contacts.value
db._create("Person"); // You already have this
db._createEdgeCollection("isInGroup"); // Save relation group -> person
db._createEdgeCollection("hasContact"); // Save relation item -> person
db.Person.save({_key: "user"}) // The remainder of the object you posted
// Now the items
db.contacts.save({_key:"phone1", type: "phone", value: '333444222' });
db.contacts.save({_key:"phone2", type: "phone", value: '555222555' });
db.contacts.save({_key:"mail1", type: "email", value: 'bob@gmail.com'});
// And the groups
db.groups.save({_key:"admin"});
db.groups.save({_key:"user"});
db.groups.save({_key:"godmode"});
// Finally the relations
db.hasContact.save({"contacts/phone1", "Person/user", {label: "main office"});
db.hasContact.save({"contacts/phone2", "Person/user", {label: "main office"});
db.hasContact.save({"contacts/mail1", "Person/user", {label: "main office"});
db.isInGroup.save("groups/admin", "Person/user", {});
db.isInGroup.save("groups/godmode", "Person/user", {});
db.isInGroup.save("groups/user", "Person/user", {});
现在您可以执行以下查询:
-
获取所有管理员:
返回邻居(组,isInGroup,“管理员”)
-
获取所有与333444222有联系的用户:
FOR x IN 联系人 FILTER x.value == "333444222" RETURN NEIGHBORS(contacts, hasContact, x)