Marklogi c с использованием xPath для управляемых документов приводит ко всем версиям этого документа - PullRequest
2 голосов
/ 10 февраля 2020


при использовании xpath для управляемого (dls: document-insert-and-manage (...)) документа я хотел бы использовать выражения xpath для этих документов, чтобы получить только фактический документ, особенно для других пользователей. .

С xpath я получаю либо все версии документа, либо нет документа.

Я попытался установить разрешения для документа.
Ограничение URI только для создания.
Защита путь не помогает, поскольку xpath одинаков для всех версий.

Есть ли возможность ограничить это для некоторых пользователей, чтобы они могли получать только последнюю версию?

Мы используем Marklogi c 9.0.8

Пример:

Задание документа с помощью

xquery version "1.0-ml";
import module namespace dls = "http://marklogic.com/xdmp/dls" at "/MarkLogic/dls.xqy";

declare variable $uri :="/smtextdocuments/9114.xml";
declare variable $document := document {
<envelope>
  <instance>
    <smtextdocuments>
      <uri>/smtextdocuments/9114.xml</uri><id>9114</id>
      <documentcontent>MyText</documentcontent>
    </smtextdocuments>
  </instance>
</envelope>
};

let $d := dls:document-insert-and-manage($uri,fn:true(), $document,
        "Manage textdocuments",
        (
         xdmp:permission("dls-user", "read"),
         xdmp:permission("dls-internal", "read"),
         xdmp:permission("dls-internal", "update")),
        ()
        )
return $d

приводит к тому, что при извлечении документов либо 2, либо ни одного элемента, в зависимости от прав реального пользователя

xquery version "1.0-ml";
<queryresult>
  <byxPath>{
    for $i in //smtextdocuments[id=9114]
    return (<uri>{fn:base-uri($i)}</uri>,$i)
    }
  </byxPath>
</queryresult>

1 Ответ

5 голосов
/ 10 февраля 2020

Вы используете DLS для параллельного хранения нескольких версий документа, поэтому, если вы запросите всю базу данных (что происходит, если вы используете абсолютный абсолютный путь, такой как //xxx), вы получите все соответствующие версии этого document.

Я бы рекомендовал перейти на использование cts:search, например, в сочетании с dls:documents-query(). Если вы также добавите индекс пути для smtextdocuments/id, вы можете точно указать свои документы:

import module namespace dls = "http://marklogic.com/xdmp/dls" 
  at "/MarkLogic/dls.xqy";

cts:search(collection(), cts:and-query((
  dls:documents-query(),
  cts:range-query(
    cts:path-reference('smtextdocuments/id'),
    '=',
    9114
  )
) 

HTH!

...