Извлечение только части JSON-документа с помощью поискового вызова API REST в MarkLogic - PullRequest
0 голосов
/ 13 сентября 2018

Я ищу способы извлечения только части документа JSON с помощью поискового вызова API REST в MarkLogic с использованием JavaScript или XQuery.Я пытался использовать параметры запроса re extract-document-data, но безуспешно.Попытка проверки моего пути извлечения с использованием пути CTS.validextract, но эта функция не была распознана в Marklogic 9.0-1

Нужно ли использовать определенные параметры поиска, такие как ограничения или структурированный запрос.Не могли бы вы помочь?TIA.

У меня есть ниже такой образец документа

{
"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 для такого конкретного требования?@ Вагнер Майкл

Ответы [ 2 ]

0 голосов
/ 02 января 2019

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

0 голосов
/ 13 сентября 2018

Вы можете извлечь данные документа, используя опцию 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, которые имеют GenreSource "ABC"!

Результат:

....
<search:extracted kind="array">[{"GenreType-Instance-Record":{"TitleGenre":["Test1"], "GenreSource":["ABC"]}}]
</search:extracted>
....

Примечание :

  • Вы можете добавить несколько <search:extract-path> элементов!
  • Мне пришлось изменить имя GenreType Instance Record на GenreType-Instance-Record.Я не уверен, что вы можете иметь имена свойств с пробелами и обращаться к ним с помощью xpath.Я не мог заставить его работать таким образом.

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

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

...