#orientdb #orientdb3.0
#orientdb #orientdb3.0
Вопрос:
Я должен вставить запись со встроенным полем в OrientDB, а затем запросить эту запись с помощью filter:
insert into MyClass set embeddedField = {'@type': 'd', 'id': 1}
работает хорошо, и
select from MyClass
возвращает добавленную мной запись. Но когда я добавляю where с фильтром для embeddedField, я не получаю результатов:
select from MyClass where embdeddedField = {'@type': 'd', 'id': 1}
Я подумал, что это может произойти, потому что Orient добавляет поле @version во встроенный документ, поэтому я попытался выполнить поиск по версии:
select from MyClass where embdeddedField = {'@type': 'd', '@version': 0, 'id': 1}
Но по-прежнему нет результатов.
Вопрос: Есть идеи, как фильтровать встроенное поле по всему документу? Без необходимости явной фильтрации по каждому полю встроенного документа:
select from MyClass
where embdeddedField.id = 1
and embdeddedField.field2 = val2
and embeddedField.field3 = val3
Потому что по нескольким причинам я хотел бы передать весь объект целиком в качестве одного параметра запроса:
select from MyClass where embdeddedField = ?
Ответ №1:
Это потому, что предоставленный хэш преобразуется во встроенный класс.
Возможно, взгляните на ActiveOrientWiki https://github.com/topofocus/active-orient/wiki/Relations
Чтобы объяснить: возьмите класс base
, там есть документ с двумя свойствами (без схемы) и добавьте к нему существующие документы
( 0..9 ).each do | b |
base_record= Base.create label: b, first_list: []
( 0..9 ).each {|c| base_record.first_list << FirstList.create( label: c ) }
end
INFO->CREATE VERTEX base CONTENT {"label":0,"first_list":[]}
INFO->CREATE VERTEX first_list CONTENT {"label":0}
INFO->update #136:0 set first_list = first_list || [#147:0] return after @this
затем ссылки внедряются, и запись выглядит следующим образом
=> #<Base:0x00000000041a60e0 @metadata={:type=>"d", :class=>"base", :version=>11, :fieldTypes=>"first_list=z", :cluster=>129, :record=>1},
@attributes={:first_list=>["#149:1", "#150:1", "#151:1", "#152:1", "#145:2", "#146:2", "#147:2", "#148:2", "#149:2", "#150:2"], :label=>"1"}>
если вы развернете элементы списка, вы можете запросить «@type»
Если вы добавляете документ без rid, происходит то же самое
( 0..9 ).each {|c| base_record.first_list << FirstList.new( label: c ) }
20.04.(12:53:59) INFO->update #130:2 set first_list = first_list || [{ @type: 'd' ,@class: 'first_list' ,label: 0 }] return after @this
INFO->CREATE VERTEX base CONTENT {"label":"c","first_list":[]}
'#130:2'.expand
=> #<Base:0x00000000043927a0 @metadata={:type=>"d", :class=>"base", :version=>11, :fieldTypes=>"first_list=z", :cluster=>130, :record=>2},
@attributes={:first_list=>["#151:12", "#152:12", "#145:13", "#146:13", "#147:13", "#148:13", "#149:13", "#150:13", "#151:13", "#152:13"], :label=>"c"}>
Если вы опустите имя класса, изменится только область действия rid
INFO-> update #132:2 set first_list = first_list || { @type: 'd' ,label: 0 } return after @this
=> [#<Base:0x0000000003a26fb8 @metadata={:type=>"d", :class=>"base", :version=>3, :fieldTypes=>"first_list=z", :cluster=>132, :record=>2},
@attributes={:first_list=>["#3:0"], :label=>"d"}>]
В любом случае запрос на @type
сбои
Комментарии:
1. Но мой вопрос касается встроенного поля, а не ссылки
2. И в любом случае я вряд ли понимаю, как эту ссылку можно рассматривать как ответ на вопрос, который я задал