MarkLogic 8 – Flux de résultats volumineux dans un fichier – JavaScript – API client Node.js

Disons que j’ai une requête qui va retourner une très grande réponse. Peut-être des milliers d’enregistrements et éventuellement des gigaoctets de données.

Normalement, dans l’interface utilisateur, nous ne montrons qu’une seule page de ces données. Maintenant, j’ai besoin d’une option pour prendre l’ensemble des résultats et le diffuser dans un fichier. Ensuite, l’utilisateur peut télécharger ce logiciel à sa guise.

Alors, comment puis-je sélectionner tous les résultats d’une requête à l’aide du générateur de requêtes, puis les transférer dans un fichier en morceaux sans manquer de mémoire?

Si vous voulez les descripteurs de document, vous pouvez ouvrir un stream d’object comme dans l’exemple suivant:

https://github.com/marklogic/node-client-api/blob/develop/examples/query-builder.js#L38

Si vous souhaitez uniquement le contenu des documents, vous pouvez utiliser un stream fragmenté comme indiqué dans l’exemple suivant (la même approche peut être utilisée pour une requête):

https://github.com/marklogic/node-client-api/blob/develop/examples/read-stream.js#L27

L’approche générale serait la suivante:

  • ouvrir le fichier de destination en tant que stream d’écriture

https://nodejs.org/api/fs.html#fs_fs_createwritestream_path_options

  • interrogez la première page de documents, en canalisant le stream de lecture des documents vers le stream d’écriture du fichier, en prenant soin de définir l’option end sur false:

https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options

  • lecture en boucle des documents, incrémentation de la longueur de la page de départ jusqu’à la fin de la lecture

  • appelez end () sur le stream d’écriture pour fermer le fichier

https://nodejs.org/api/stream.html#stream_writable_end_chunk_encoding_callback

En espérant que ça aide