Как получить максимальное значение элемента из всей базы данных в Marklogic? - PullRequest
0 голосов
/ 29 августа 2018

Я хочу получить максимальное значение <ID> из всех документов, представленных в базе данных.

Образец документа -

<root>
   <ID>3253523</ID>
   <value1>.....</value1>
   <value2>.....</value2>
   <value3>.....</value3>
   <value4>.....</value4>
    .....................
</root>

Моя база данных содержит более 1 миллион записей, и я хочу получить идентификатор, который имеет наибольшее значение среди всех.

Я не могу использовать fn:last(), потому что это не даст мне максимальное значение.

Мне нужно использовать это значение для создания INCREMENTAL COUNTER (максимальное значение станет моим первым значением для COUNTER).

Любые предложения, чтобы получить это значение эффективным способом? Потому что я не могу сделать cts:search() более 1 миллион записей, а затем сделать orderby ascending и получить последнее значение.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Когда вам нужно получить максимум или какой-либо другой агрегат элемента, содержащего дату, цену, число или другое значение, ответ от Илии будет адекватным.

Для конкретного случая последовательных чисел есть кое-что еще. Как гарантировать уникальность между потоками при параллельном приеме? Это нетривиальная проблема, и мы обычно рекомендуем не использовать последовательные числа по соображениям производительности. Вместо этого используйте случайные числа. Это делает столкновение практически невозможным и предотвращает конфликты для получения максимального + 1 идентификатора.

Я создал библиотеку, которая позволяет создавать уникальные идентификаторы различными способами, и подробно описывает плюсы и минусы каждого из них:

https://github.com/grtjn/ml-unique#how-it-works

НТН!

0 голосов
/ 29 августа 2018

Вы можете добавить индекс диапазона элемента к элементу ID, а затем использовать функцию cts:values, чтобы получить первое из проиндексированных значений в порядке убывания.

Пример:

(: assuming a path range index for an int scalar at path '/root/ID' :)
for $i in 1 to 100
  let $doc := <root><ID>{$i}</ID></root>
  return
    xdmp:document-insert("/test/doc-" || $i, $doc, (), "test");

(cts:values(cts:path-reference("/root/ID"), (), "descending"))[1]
...