更新:有关如何在Javascript中执行此操作的问题,请参阅MarkLogic 8 - Stream large result set to a file - JavaScript - Node.js Client API。这个问题专门询问XQuery。
我有一个Web应用程序,它使用node.js中托管的其他服务。
Node简单地将请求代理到XQuery,然后XQuery查询MarkLogic。 这些查询已经具有分页设置,并且在正常情况下正常工作,以将数据页面返回到UI。
我需要有一个导出功能,当我在请求中放置export=all
的URL参数时,它不会再查找页面了。
此时它应该获得整个结果集,即使它是一百万条记录,并将其保存到文件中。
实际请求需要立即返回说:“我们会在您的下载准备就绪时通知您。”
一个建议是使用xdmp:spawn
在后台调用XQuery,将结果保存到文件中。然后我的实际HTTP请求可以立即返回。
对于产生的部分,我认为我的想法是我使用不同的选项运行我的查询,以获得所有结果而不是一个页面。然后我将遍历数据并创建一个字符串变量来调用xdmp:save with。
有些问题,这是个好主意吗?有没有更好的办法?如果我遍历结果集并且它确实非常大(千兆字节),它可能会导致内存问题。
是否无法直接将结果流式传输到XQuery中的文件?
注意:我的另一个想法是在代理(节点)层拦截请求,然后执行xdmp:估计以获取记录计数,然后循环查询每个页面并将其刷新到磁盘。在这种情况下,我需要找到一些方法来立即返回我的请求,然后在节点的后台处理,这似乎有一些想法:http://www.pubnub.com/blog/node-background-jobs-async-processing-for-async-language/
答案 0 :(得分:1)
一种可能的策略是使用自生成任务,在每次迭代时,获取查询结果的下一页。
但是,您可能需要考虑使用xdmp:http-post()将每个页面发送到服务器,而不是将结果直接保存到文件中:
http://docs.marklogic.com/xdmp:http-post?q=xdmp:http-post&v=8.0&api=true
特别是,服务器可以是Node.js服务器,它在每个页面到达文件或任何其他数据链时附加。
这样,Node.js可以在数据库服务器上以最小的负载处理长时间运行的异步IO。
当自生成的任务到达查询的末尾时,它可以再次使用HTTP请求通知Node.js关闭文件并报告导出已完成。
Hping有帮助,