Управление встроенными коллекциями, объектами и особенно customFields в orientdb - PullRequest
0 голосов
/ 29 марта 2020

Я экспериментирую с OrientDB для конкретного проекта c, который я имею в виду, и я надеюсь, что кто-то прояснит меня. Давайте возьмем следующую модель.

create class T extends V
create property T.LIST EMBEDDEDLIST
create property T.MAP EMBEDDEDMAP
create vertex T set MAP={}, LIST=[]

Хорошо, я предполагаю, что EMBEDDEDLIST - это коллекция.

Инициализация работает так, как и ожидалось: update T set LIST = [], настройка по индексу также работает: update T set LIST[0] = {a:0} как удаление по индексу update T remove LIST[0]. К сожалению, удаление по условию не поддерживается. Это также работает: update T set LIST[0].b=2.

В соответствии с документацией это должно обновить, чтобы добавить значение в коллекцию : update T add LIST = {a:1}, но не может:

Невозможно выполнить с новым исполнителем UPDATE PUT / ADD / INCREMENT: ADD LIST = {"a": 1}

Вопрос 1: как я могу pu sh элемент в такую ​​коллекцию (не зная ее текущего размера), или EMBEDDEDLIST вообще не является коллекцией?

Хорошо, давайте посмотрим на EMBEDDEDMAP. Предположим, что это карта, это должно поставить запись в поле карты : update T put MAP = 'a' , 1. Ну, это не так, он терпит неудачу с аналогичной ошибкой. update T set MAP.a = 1 работает, как и update T remove MAP.a. Таким образом, я могу жить без PUT, но разве EMBEDDEDMAP не является картой тогда?

Вопрос 2 : где именно можно использовать PUT и ADD?

Хорошо, а теперь Последняя проблема: я хочу манипулировать и использовать свойство customFields свойств класса, найденных в metadata:schema.classes. Но вся схема базы данных представляет собой единый объект, то есть это набор объектов, описывающих классы. Объект, описывающий класс, в свою очередь, имеет свойство коллекции для свойств класса. Который, в свою очередь, имеет свойство с именем customFields.

Теперь, в моем случае select classes[name='T'].properties[0][name='MAP'].customFields from #0:1 возвращает значение customFields для свойства T.MAP. Отлично, давайте попробуем обновить!

Я пробовал:

update #0:1 set classes[name='T'].properties[0][name='MAP'].customFields = {a:1}
update #0:1 set classes[name='T'].properties[0][name='MAP'].customFields.a = 1
update #0:1 set classes[name='T'].properties[name='MAP'].customFields = {a:1}
update #0:1 set classes[name='T'].properties[name='MAP'].customFields.a = 1

Оба выглядят работающими (на самом деле те, у которых нет индекса 0, должны быть правильными), но никто не меняет поле вообще.

На самом деле есть документированный способ, но он довольно ограничен, поскольку он реализует только Map :

alter property T.MAP custom a=1

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

Вопрос 3 : Как я могу изменить это Speci c только поле?

...