Извлечение только части JSON-документа с помощью поискового вызова API REST в MarkLogic

1

Я ищу методы извлечения только части документа 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 для такого конкретного требования? @Вагнер Майкл

  • 0
    Не могли бы вы отредактировать свой вопрос, чтобы поделиться опциями запроса, в частности, частью extract-document-data? А также фрагмент кода, который вы использовали для проверки пути?
  • 0
    Конечно, я добавляю. Я путешествовал, поэтому фрагмент кода не был удобен.
Показать ещё 1 комментарий
Теги:
search
xquery
marklogic

2 ответа

1

Огромное спасибо Вагнеру за быстрые испытания. Помог мне найти точное решение моей проблемы на данный момент. Я использовал ниже путь извлечения, поскольку я не мог изменить имена в документах. /GenreType/array-node("GenreType Instance Record")/object-node()/TitleGenre[following-sibling::GenreSource="ABC"]

  • 0
    Будет ли хорошей практикой использование того, что я использовал? Любые комментарии, пожалуйста?
1

Вы можете извлечь данные документа, используя опцию 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. Я не мог заставить это работать таким образом.

Пожалуйста, опубликуйте параметры поиска, если это не работает для вас.

Редактировать: добавлен предикат к пути извлечения.

  • 0
    Спасибо за быстрый ответ. Я пытаюсь это Я буду обновлять здесь наверняка.
  • 0
    Как я могу получить только документы с отфильтрованным путем извлечения в следующем примере мне нужны документы только с "Source" = "ABC", поэтому в извлеченном узле он должен возвращать только эти экземпляры. {"Type": {"Name": " Тип "," Экземпляр типа: [{"Id": "4022", "Заголовок": ["AAA"], "Источник": ["ABC"], "Территория": ["100"]}]}}
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню