【发布时间】:2015-08-26 04:24:22
【问题描述】:
更新:请参阅MarkLogic 8 - Stream large result set to a file - JavaScript - Node.js Client API 以获取有关如何在 Javascript 中执行此操作的答案。这个问题专门询问 XQuery。
我有一个使用 node.js 中托管的 rest 服务的 web 应用程序。
Node 只是将请求代理到 XQuery,然后 XQuery 查询 MarkLogic。 这些查询已经设置了分页,并且在正常情况下可以正常工作以将一页数据返回给 UI。
我需要有一个导出功能,这样当我在请求中添加export=all 的 URL 参数时,它就不再查找页面了。
此时它应该获取整个结果集,即使是一百万条记录,并将其保存到文件中。
实际的请求需要立即返回,说“当您的下载准备好时,我们会通知您。”
一个建议是使用xdmp:spawn 在后台调用XQuery,将结果保存到文件中。然后我的实际 HTTP 请求可以立即返回。
对于生成部分,我认为我的想法是使用不同的选项运行查询,以便获得所有结果而不是一页。然后我会遍历数据并创建一个字符串变量来调用 xdmp:save 。
一些问题,这是个好主意吗?有没有更好的办法?如果我遍历结果集并且它确实非常大(千兆字节),则可能会导致内存问题。
有没有办法直接将结果流式传输到 XQuery 中的文件?
注意:我的另一个想法是在代理(节点)层拦截请求,然后执行 xdmp:estimate 以获取记录数,然后循环查询每个页面并将其刷新到磁盘。在这种情况下,我需要找到一些方法来立即返回我的请求,但在节点的后台处理,这似乎有一些想法:http://www.pubnub.com/blog/node-background-jobs-async-processing-for-async-language/
【问题讨论】: