Buscar pares únicos de elementos y convertir el resultado ordenado a JSON.
Tengo la siguiente entrada de ejemplo: (Son documentos individuales)
<performance>
<year>2016</year>
<industry>Financials</industry>
<benchmark>Healthcare</benchmark>
</performance>
<performance>
<year>2017</year>
<industry>Technology</industry>
<benchmark>Financials</benchmark>
</performance>
<performance>
<year>2018</year>
<industry>Technology</industry>
<benchmark>Financials</benchmark>
</performance>
<performance>
<year>2019</year>
<industry>Financials</industry>
<benchmark>Materials</benchmark>
</performance>
<performance>
<year>2020</year>
<industry>Technology</industry>
<benchmark>Materials</benchmark>
</performance>
<performance>
<year>2021</year>
<industry>Technology</industry>
<benchmark>Healthcare</benchmark>
</performance>
Necesito encontrar las combinaciones de la industria y el benchmark, ordenar el documento de resultado por año y, finalmente, transformar las combinaciones en JSON. Me gustaría usar el índice de Marklogic para acelerar la búsqueda y transformación. La salida esperada es:
{
"Financials": [
"Materials",
"Healthcare"
],
"Technology": [
"Healthcare",
"Materials",
"Financials"
]
}
Mi código XQuery es:
let $keys := ('Financials', 'Technology')
let $map := map:map()
let $_ :=
for $key in $keys
let $query := cts:path-range-query("/performance/industry", "=", $key)
let $v := cts:values(cts:path-reference('/performance/benchmark'), (), (), $query)
return map:put($map, $key, $v)
return xdmp:to-json($map)
Resultado inesperado:
{
"Financials": [
"Healthcare",
"Materials"
],
"Technology": [
"Financials",
"Healthcare",
"Materials"
]
}
¿Estoy usando XQuery de manera incorrecta o comprendo mal cómo funciona el índice de Marklogic? ¿Cómo puedo obtener la salida correcta? Estoy de acuerdo con JavaScript o XQuery.
davy.ai
Parece que el código de Xquery funciona correctamente y utiliza el índice de Marklogic. La salida inesperada puede deberse al orden en el que se procesaron los documentos o a cómo se estructuraron los documentos de entrada.
Para obtener la salida esperada, puedes modificar el código de Xquery para ordenar los valores por año antes de agregarlos al mapa. Aquí tienes una versión actualizada del código:
Este código recupera los valores del índice y los ordena por año antes de agregarlos al mapa. La función
documents()
se utiliza para recuperar los documentos individuales en función del valor de referencia del benchmark.La salida debería ser la esperada:
Ten en cuenta que este código asume que solo hay un documento por combinación de benchmark y año. Si hay varios documentos, la función
sort()
puede no funcionar correctamente.