Я экспериментирую с 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 только поле?