Я ищу методы извлечения только части документа JSON с помощью поискового вызова API REST в MarkLogic с использованием JavaScript или XQuery. Я пытался использовать параметры запроса re извлечения-документа-данных, но не удалось. Попытка проверки моего пути извлечения с использованием пути CTS.validextract, но эта функция не была распознана в Marklogic 9.0-1
Нужно ли использовать конкретные параметры поиска, такие как ограничения или структурированный запрос. Не могли бы вы помочь? ТИА.
У меня есть ниже такой образец документа
{
"GenreType": {
"Name": "GenreType",
"LongName": "Genre Complex",
"AttributeDataType": "String",
"GenreType Instance Record": [
{
"Name": "GenreType Instance Record",
"Action": "NoChange",
"TitleGenre": [
"Test1"
],
"GenreL": [
"Test1"
],
"GenreSource": [
"ABC"
],
"GenreT": [
"Test1"
]
},
{
"Name": "GenreType Instance Record",
"Action": "NoChange",
"TitleGenre": [
"Test2"
],
"GenreL": [
"Test2"
],
"GenreSource": [
"PQR"
],
"GenreT": [
"Test2"
]
}
]
}
}
в котором мне нужно найти документ с атрибутом "TitleGenre", ГДЕ GenreSource = "ABC" в сложном атрибуте GenreType. Это массив в json документе.
Я использовал опцию поиска, как показано ниже (пишу опцию поиска в XML, но ищу в документах json)
<extract-path>/GenreType/"GenreType Instance Record"[@GenreSource="ABC"]</extract-path>
Я все еще сталкиваюсь с проблемами. Если возможно, не могли бы вы, пожалуйста, сообщить мне, как можно искать документы json для такого конкретного требования? @Вагнер Майкл
Огромное спасибо Вагнеру за быстрые испытания. Помог мне найти точное решение моей проблемы на данный момент. Я использовал ниже путь извлечения, поскольку я не мог изменить имена в документах. /GenreType/array-node("GenreType Instance Record")/object-node()/TitleGenre[following-sibling::GenreSource="ABC"]
Вы можете извлечь данные документа, используя опцию extract-document-data
.
xquery version "1.0-ml";
let $doc := object-node {
"GenreType": object-node {
"Name": "GenreType",
"LongName": "Genre Complex",
"AttributeDataType": "String",
"GenreType-Instance-Record": array-node {
object-node {
"TitleGenre": array-node {
"Test1"
},
"GenreSource": array-node {
"ABC"
}
},
object-node {
"TitleGenre": array-node {
"Test2"
},
"GenreSource": array-node {
"PQR"
}
}}
}
}
return xdmp:document-insert("test.xml", $doc);
import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy";
search:search(
"Genre Complex",
<options xmlns="http://marklogic.com/appservices/search">
<extract-document-data>
<extract-path>/GenreType/GenreType-Instance-Record[GenreSource = "ABC"]</extract-path>
</extract-document-data>
</options>
)
В этом случае /GenreType/GenreType-Instance-Record
является xpath для извлеченного элемента. Что касается вашего комментария, я также добавил предикат [GenreSource = "ABC"]
. Таким образом, GenreType-Instance-Record
только записи GenreType-Instance-Record
имеющие GenreSource
"ABC"!
Результат:
....
<search:extracted kind="array">[{"GenreType-Instance-Record":{"TitleGenre":["Test1"], "GenreSource":["ABC"]}}]
</search:extracted>
....
Примечание:
<search:extract-path>
!GenreType Instance Record
GenreType-Instance-Record
на GenreType-Instance-Record
. Я не уверен, что вы можете иметь имена свойств с пробелами и обращаться к ним с помощью xpath. Я не мог заставить это работать таким образом.Пожалуйста, опубликуйте параметры поиска, если это не работает для вас.
Редактировать: добавлен предикат к пути извлечения.