Есть ли способ поиска документов, где один индекс диапазона пути равен другому? - PullRequest
0 голосов
/ 11 января 2019

Я хочу получить все документы, в которых значение индекса одного диапазона пути равно другому значению в том же документе (Пример: / метаданные / название книги = / метаданные / название главы). Есть ли способ?

Ответы [ 2 ]

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

Очевидная мысль - передать результат cts:values для одного поля в так называемый запрос дробовика-ИЛИ для другого поля, но это не гарантирует, что оба поля в документе равны. После этого вам придется вручную фильтровать ложные срабатывания с помощью XPath, что не очень оптимально.

Лучше всего использовать Optic API . Что-то вроде этого дает вам представление о том, как это будет работать:

import module namespace op="http://marklogic.com/optic"
     at "/MarkLogic/optic.xqy";

op:from-lexicons(
  map:new((
    map:entry("bookTitle", cts:element-reference(xs:QName("book-title"))),
    map:entry("chapterTitle", cts:element-reference(xs:QName("chapter-title"))),
    map:entry("uri", cts:uri-reference())
  )),
  "books"
)
 => op:where(
      op:eq(
        op:view-col("books", "bookTitle"),
        op:view-col("books", "chapterTitle")
      )
    )
 => op:result() 

Вы можете заменить ссылки на элементы другими ссылками, такими как ссылки на пути, если они соответствуют вашим индексам.

НТН!

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

Да - вы передаете результат cts: значения ([ссылка на ваш путь-индекс-указатель]) в cts: range-query другого.

let $title-list := cts:values(cts:path-reference("/metadata/book-title"))
let $match-query := cts:range-query(
  cts:path-reference("/metadata/chapter-title"),
  "=",
  $title-list
)

Затем используйте $ match-query для более крупного запроса.

Обратите внимание, что это простой пример. В действительности вы, скорее всего, будете настраивать как полный запрос, так и cts: values ​​() с параметрами запроса и, возможно, запросом, ограничивающим результаты cts: values ​​().

Также обратите внимание, что есть также cts: path-range-query (), а не range-query, который может быть более удобным. Однако я стараюсь придерживаться общего кода (не обращая внимания на то, откуда взяты данные в индексе, поскольку детали реализации могут со временем меняться).

...