Мы создаем корпоративное приложение с ML в качестве исходного кода. Многие экраны в приложении имеют выпадающие списки, которые требуют различных значений элементов внутри документов. Таким образом, мы создали индекс диапазона элементов для этих элементов и подготовили код для получения отдельных значений с использованием индекса диапазона.Ограничение диапазона индексов по элементам в документах определенной коллекции
Теперь мы разделяем документы в разные коллекции логически - как «basedata» коллекция, в которой хранятся все документы базы данных приложений и коллекция «transactiondata», которая содержит все входящие/исходящие транзакции для нашего приложения.
Теперь необходимо ограничить индекс диапазона только базовыми документами сбора данных, а не документами транзакционных данных.
Например: если у нас есть индекс диапазона элементов LocalName = «EntityName» мы не хотим индекса диапазон, который будет построен для значений EntityName присутствующих в документах транзакционного сбора данных. Мы хотим, чтобы различные значения «entityName» встречались только в документах, прикрепленных к коллекции basedata.
Как мы можем достичь этого?
Edit:
Спасибо Давид и grtjn.
Это то, что мы сейчас делаем в Java слой: Код ниже правильно возвращая различные имена для поля EntityName, который имеет индекс диапазона, созданный.
String valueOptionString =
" <search:options xmlns:search="http://marklogic.com/appservices/search">
<search:values name="entityName">
<search:range type="xs:string">
<search:element name="entityName">
</search:element>
</search:range>
</search:values>
</search:options> ";
QueryManager queryMgr = client.newQueryManager();
QueryOptionsManager optionsMgr = client.newServerConfigManager().newQueryOptionsManager();
optionsMgr.writeOptions("DistinctValues", new StringHandle(valueOptionString));
ValuesDefinition vdef = queryMgr.newValuesDefinition("entityName", "DistinctValues");
ValuesHandle vh = queryMgr.values(vdef, new ValuesHandle());
for (CountedDistinctValue value : vh.getValues()) {
System.out.println("Distinct value is :: " +
value.get("xs:string", String.class));
}
Как вы видите, я не устанавливать коллекцию в любом месте на queryMgr.values (); Основываясь на предложениях условии, что я попытался добавить коллекцию ограничение ИНТ на valueOptionString, но он не работает. Правильно ли это? Есть ли другой способ встречается из
<search:options xmlns:search="http://marklogic.com/appservices/search">
<search:values name="createdBy">
<search:range type="xs:string">
<search:element name="createdBy"/>
</search:range>
<search:collection>
<search:uri>basedaata</search:uri>
<search:uri>tansactiondata</search:uri>
</search:collection>
</search:values>
</search:options>
Ошибка:
Local message: /config/query write failed: Bad Request. Server Message: RESTAPI-INVALIDCONTENT: (err:FOER0000) Invalid content: Op
eration results in invalid Options: XDMP-VALIDATEUNEXPECTED: (err:XQDY0027) validate strict { $opt } -- Invalid node: Found text{"basedaata..."} but expected() at fn:doc("")
EDIT 2:
Основываясь на ответах ниже я обновил свой код, чтобы включить «additional- запрос "в необязательном запросе, чтобы содержать различные возвращаемые значения. Однако это выглядит дополнительная часть запроса игнорируется и не работает, как ожидалось
Изменено дополнительный запрос:
<search:options xmlns:search="http://marklogic.com/appservices/search">
<search:values name="entityName">
<search:range type="xs:string">
<search:element name="entityName"/>
</search:range>
</search:values>
<search:additional-query>
<cts:collection-query xmlns:cts="http://marklogic.com/cts">
<cts:uri>basedata</cts:uri>
<cts:uri>DistinctValueTest</cts:uri>
</cts:collection-query>
</search:additional-query>
</search:options>
Ниже приведены документы, у меня есть. Также у меня есть индекс диапазона элементов в поле entityName ..
Документ в коллекции basedata:
<?xml version="1.0" encoding="UTF-8"?>
<entity>
<entityName>Company</entityName>
<createdBy>CompanyOwner</createdBy>
<createdDate>2017-01-01T05:56:35.360Z</createdDate>
<status>Active</status>
<entityattributes>
<entityattribute>
</entityattribute>
</entityattributes>
</entity>
Теперь создала коллекцию под названием тест DistinctValueTest и добавлен документ для целей тестирования в этой коллекции.
Документ в коллекции DistinctValueTest:
<?xml version="1.0" encoding="UTF-8"?>
<entity>
<entityName>DistinctValueTestEntity</entityName>
<createdBy>DistinctValuteSystemNew</createdBy>
<createdDate>2017-01-03T05:56:35.360Z</createdDate>
<status>Active</status>
<entityattributes>
<entityattribute>
</entityattribute>
</entityattributes>
</entity>
Выход программы: Компания, DistinctValueteSystemNew когда обе коллекции поставляются в дополнительной секции запроса
<cts:collection-query xmlns:cts="http://marklogic.com/cts">
<cts:uri>basedata</cts:uri>
<cts:uri>DistinctValueTest</cts:uri>
</cts:collection-query
Однако, если я только предоставляют сборку «basedata» в cts: uri она по-прежнему показывает продукцию как Company, DistinctValueteSystemNew, а не просто Компания
<cts:collection-query xmlns:cts="http://marklogic.com/cts">
<cts:uri>basedata</cts:uri>
</cts:collection-query
Возможно, было бы лучше разместить часть редактирования в отдельном вопросе .. – grtjn