Динамический индекс Arangodb по ключам объекта

Арангодб 2.8б3

Иметь документ с некоторым свойством "спецификация", может иметь 1-100 ключей внутри, например

document {
  ...
  specification: {
      key1: "value",
      ...
      key10: "value"
  }
}

Быстрый запрос задачи по спецификации.key

For Doc IN MyCollection FILTER Doc.specification['key1'] == "value" RETURN Doc

Пробовал создавать хеш-индексы с полем: "спецификация", "спецификация.*", спецификация[*], спецификация[*].*

Индекс никогда не использовался, существует ли какое-либо решение без реорганизации структуры или планов на будущее?


person Felix Berth    schedule 08.01.2016    source источник


Ответы (1)


Нет, в настоящее время у нас нет разумной идеи, как обрабатывать индексы для подобных структур. Использование памяти также увеличилось бы, поскольку имена атрибутов также должны были бы присутствовать в индексе для каждого проиндексированного значения.

В версии 2.8 мы выпустим возможность использовать индексы в структурах массивов. :

db.posts.ensureIndex({ type: "hash", fields: [ "tags[*]" ] });

с такими документами:

{ tags: [ "foobar", "bar", "anotherTag" ] }

Используя запросы AQL следующим образом:

FOR doc IN posts
  FILTER 'foobar' IN doc.tags[*]
  RETURN doc

Вы также можете индексировать документы в массивах:

db.posts.ensureIndex({ type: "hash", fields: [ "tags[*].value" ] });
db.posts.insert({
  tags: [ { key: "key1", value: "foobar"},
          { key: "key2", value: "baz" },
          { key: "key3", value: "quux" }
        ] });

Следующий запрос будет использовать индекс массива:

FOR doc IN posts
  FILTER 'foobar' IN doc.tags[*].value
  RETURN doc

Однако звездочку можно использовать только для доступа к массиву — она не может заменить совпадения ключей в объектах.

person dothebart    schedule 11.01.2016
comment
Последний вариант не решается, я ищу не значение, мне нужно сравнить значение с ключом (ключ = A и значение = B), а не значение в значениях. Elasticsearch имеет индекс динамического сопоставления объектов, теперь я использую его для поиска, а затем выбираю записи из arangodb по идентификаторам. Как бы странно это не звучало, но это быстрее.. - person Felix Berth; 12.01.2016