Как получить доступ к данным из нескольких документов в коллекции с помощью самостоятельного присоединения в ArangoDB

Я сохранил данные в ArangoDB 2.7.1, как и с именем коллекции DSP:

{"content": "Book.xml", "type": "string", "name": "name", "key": 102}
{"content": "D:/XMLexample/Book.xml", "type": "string", "name": "location", "key": 102}
{"content": "xml", "type": "string", "name": "mime-type", "key": 102}
{"content": 4130, "type": "string", "name": "size", "key": 102}
{"content": "Sun Aug 25 07:53:32 2013", "type": "string", "name": "created_date", "key": 102}
{"content": "Wed Jan 23 09:14:07 2013", "type": "string", "name": "modified_date", "key": 102}
{"content": "catalog", "type": "tag", "name": "root", "key": 102}
{"content": "book", "type": "string", "name": "tag", "key": 103} 
{"content": "bk101", "type": {"py/type": "__builtin__.str"}, "name": "id", "key": 103}
{"content": "Gambardella, Matthew", "type": {"py/type": "__builtin__.str"}, "name": "author", "key": 1031} 
{"content": "XML Developer's Guide", "type": {"py/type": "__builtin__.str"}, "name": "title", "key": 1031}
{"content": "Computer", "type": {"py/type": "__builtin__.str"}, "name": "genre", "key": 1031}
{"content": "44.95", "type": {"py/type": "__builtin__.str"}, "name": "price", "key": 1031}
{"content": "2000-10-01", "type": {"py/type": "__builtin__.str"}, "name": "publish_date", "key": 1031}
{"content": "An in-depth look at creating applications with XML.", "type": {"py/type": "__builtin__.str"}, "name": "description", "key": 1031}

Здесь единый набор {"content": "Book.xml", "type": "string", "name": "name", "key": 102} представляет один документ в коллекции.

Теперь я хочу получить доступ ко всем документам с одинаковым значением атрибута key в нескольких документах или со значением title и price, где жанр «компьютер», для того же значения key. Я пробовал использовать AQL как FOR p IN DSP filter p.name == "publish_date" AND p.content == "2000-10-01" AND p.name == 'title' return p, но это возвращает пустой установлен, потому что он сравнивается в одном документе, а не в коллекции.

Как и в случае с реляционной базой данных, здесь требуется какое-то самостоятельное соединение, но я не знаю, как это будет применяться. Скажите, пожалуйста, как мне получить доступ ко всем документам с одинаковым значением ключевого атрибута, где publish_date - "2000-10-01". Я ожидаю, что результатом этого запроса будут следующие документы, потому что, соответствующее publish_date со значением 2000-10-01, значение key равно 1031:

{"content": "Gambardella, Matthew", "type": {"py/type": "__builtin__.str"}, "name": "author", "key": 1031} 
{"content": "XML Developer's Guide", "type": {"py/type": "__builtin__.str"}, "name": "title", "key": 1031}
{"content": "Computer", "type": {"py/type": "__builtin__.str"}, "name": "genre", "key": 1031}
{"content": "44.95", "type": {"py/type": "__builtin__.str"}, "name": "price", "key": 1031}
{"content": "2000-10-01", "type": {"py/type": "__builtin__.str"}, "name": "publish_date", "key": 1031}
{"content": "An in-depth look at creating applications with XML.", "type": {"py/type": "__builtin__.str"}, "name": "description", "key": 1031}

person Mrityunjay Singh    schedule 19.01.2016    source источник


Ответы (1)


Предполагая, что дата публикации хранится в атрибуте name, а его значение - в атрибуте content, вам сначала нужно найти все документы с этой комбинацией:

FOR self IN DSP 
  FILTER self.name == 'publish_date' && self.content == '2000-10-01'
  RETURN self

Теперь, когда эти документы найдены, вы можете снова присоединить их к коллекции DSP, отфильтровав документы с одинаковым значением key, но исключив уже найденные документы из исходного FOR:

FOR self IN DSP 
  FILTER self.name == 'publish_date' && self.content == '2000-10-01'
  FOR other IN DSP 
    FILTER other.key == self.key && other._key != self._key 
    RETURN { self, other }

Если вы всегда фильтруете по имени, содержанию и / или ключу, возможно, имеет смысл проиндексировать эти атрибуты. Похоже, что key заслуживает отдельного индекса. Хеш-индекса должно хватить, поскольку key всегда будет сравниваться на равенство. name и content (в этом порядке) могут быть помещены в индекс специалиста.

person stj    schedule 20.01.2016