es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encontrar todos los registros de timestamps en MarkLogic Xquery dentro de 1 minuto uno del otro.

Lamento este caso de uso bastante específico.

Tengo una secuencia de documentos que todos tienen un campo de marca de tiempo:

2021-12-15T03:06:04Z
2021-12-15T03:06:14Z
2021-12-15T03:06:24Z
2021-12-15T03:06:34Z
2021-12-15T03:06:44Z
2021-12-15T03:07:04Z
2021-12-15T03:17:04Z

Mi objetivo es identificar qué documentos están todos dentro de 1 minuto el uno del otro y eliminar todos los documentos excepto uno de esos (para tener solo 1 documento por cada intervalo de 60 segundos). No importa qué documento se mantenga.

¿Existen alguna función de dateTime o xfunct que pueda aprovechar para abordar esto de manera elegante? Una gran limitación de los datos es que todas las marcas de tiempo son aleatorias, no hay patrones en las marcas de tiempo que podamos aprovechar. Además, esto debe ejecutarse en aproximadamente 1,000 documentos cada 3 horas, por lo que el rendimiento también es un problema.

Gracias de antemano a quien responda.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, existen funciones de dateTime y xfunct que se pueden aprovechar para resolver este problema. Puede utilizar las funciones xdmp:hour-from-dateTime y xdmp:minute-from-dateTime para extraer los componentes de hora y minuto de la marca de tiempo, respectivamente. Luego, puede agrupar los documentos por hora y minuto, y eliminar todos los documentos excepto uno de cada grupo.

    Aquí hay un ejemplo de código XQuery que logra esto:

    (: Reemplace la variable "docs" con la secuencia de documentos que desea procesar:)
    
    let $docs := (
      "2021-12-15T03:06:04Z",
      "2021-12-15T03:06:14Z",
      "2021-12-15T03:06:24Z",
      "2021-12-15T03:06:34Z",
      "2021-12-15T03:06:44Z",
      "2021-12-15T03:07:04Z",
      "2021-12-15T03:17:04Z"
    )
    
    (: Agrupar los documentos por hora y minuto:)
    
    let $groups := for $doc in $docs
                  group by $hour := xdmp:hour-from-dateTime(xs:dateTime($doc)),
                           $minute := xdmp:minute-from-dateTime(xs:dateTime($doc))
                  return
                  (
                    $hour,
                    $minute,
                    $doc
                  )
    
    (: Mantener solo un documento por grupo y eliminar el resto:)
    
    let $to-delete := for $group in $groups
                      let $keep := fn:head($group)
                      return
                      (
                        fn:subsequence($group, 2),
                        $keep
                      )
    
    return
    xdmp:document-delete($to-delete)
    

    Este código agrupa los documentos por hora y minuto utilizando las funciones xdmp:hour-from-dateTime y xdmp:minute-from-dateTime, y luego mantiene solo un documento por grupo seleccionando el primer documento utilizando la función fn:head, y eliminando el resto utilizando la función xdmp:document-delete.

    Tenga en cuenta que el código asume que el campo de la marca de tiempo está en formato ISO 8601, que es el formato predeterminado utilizado por MarkLogic. Si su campo de marca de tiempo utiliza un formato diferente, es posible que deba ajustar el código en consecuencia.

Comments are closed.