2016-03-18 63 views
2

我有MarklLogic中的JSON文档的集合,我希望返回到作为JSON数组的API调用。如何将JSON文档的集合作为JSON数组返回

fn.collection('my-users') 

返回一系列JSON文档,我需要一个有效的JSON对象,一个数组。我在服务器端java脚本中执行此操作,并推送到一个新的空数组()。

没有实际的例子说明文件,以我所知,只有在XQuery的一些examples.Google不断提及这一非常高的水平文档here

var myArray = []; 

for (d of fn.collection('my-users')){ 
    myArray.push(d); 
} 

myArray 

我需要遍历每个项目推到一个序列中数组还是有更优雅/更快的解决方案?

雨果

+0

并不清楚你所要求的东西。输出应该是什么样子?你想为每个文件提供JSON表示吗?文件是JSON还是XML?另请参阅http://docs.marklogic.com并选择左上窗格中的“服务器端JavaScript API”部分。大多数XQuery函数也可用于服务器端JavaScript。 – scotthenninger

+0

fn.collection('my-users')。toArray()就是我需要的 –

回答

3

可疑指标来自ES6,并且是(据我所知),是SJS和子序列最初发布时唯一携带的东西之一。

这些的原因是,您可以获得与使用xQuery中的序列和子序列相同的行为。 (不同的符号两种语言,但相同的行为)

如果有一个全面实施ES6的,那么你的答案会是Array.from(iteratable)

然而,如果没有该功能,那么我认为你正在使用的最有效的方法。但要小心,不要将整个数据库从迭代器推送到数组。

我是需要他们在一个数组实际上好奇您的用情况..

-David

+2

它实际上是* iterable *,而不是* iterator *。区别很微妙,但很重要。在我们支持'Array.from()'(即将推出)之前,还有'ValueIterator.prototype'上的'.toArray()'方法。 –

+0

谢谢贾斯汀的澄清。 “(这是即将到来的)”听起来令人兴奋 - 可以等待看到与SJS有关的其他途径...... @Hugo - 请参阅Justin对.toArray()的评论... –

+0

fn.collection('my-用户')toArray()正常工作 –

6

如果你需要他们回来作为一个JSON数组,你正在做正确的事情。我知道没有更优雅/更快的解决方案。但是,如果您正在寻找更优化/高性能的方式,请尝试使用REST extensions,这会将文档序列转换为多部分HTTP响应。

下面是一个例子。鉴于example.sjs与内容:

function get(context, params) { 
    return fn.collection('my-users') 
} 
exports.GET = get; 

安装像这样:

curl --anyauth --user admin:admin -X PUT -i \ 
    -H "Content-type: application/vnd.marklogic-javascript" \ 
    --data-binary @./example.sjs \ 
    http://localhost:8000/LATEST/config/resources/js-example 

而下面的文档插入我的用户集合(我假设你知道如何将这些):

myuser.json

{"name":"Sue"} 

myuser2.json

{"name":"Mary"} 

myuser3.json

{"name":"Jane"} 

myuser4.json

{"name":"Joe"} 

你可以叫你休息的扩展,像这样:

curl --anyauth --user admin:admin \ 
    http://localhost:8000/LATEST/resources/js-example 

,你会得到下面的多部分http回应:

--js-example-get-result 
Content-Type: application/json 
Content-Length: 14 

{"name":"Sue"} 
--js-example-get-result 
Content-Type: application/json 
Content-Length: 15 

{"name":"Mary"} 
--js-example-get-result 
Content-Type: application/json 
Content-Length: 15 

{"name":"Jane"} 
--js-example-get-result 
Content-Type: application/json 
Content-Length: 14 

{"name":"Joe"} 
--js-example-get-result-- 

使用您最喜爱的客户端http库来接受作为每个文档的单个json文档的高效响应。

我应该补充说,如果您的要求很简单,那么不需要REST扩展。您可以简单地使用REST搜索端点:

curl --anyauth --user admin:admin \ 
    -H accept:multipart/mixed \ 
    http://localhost:8000/LATEST/search?collection=my-users 

并获得非常相似的多部分http响应。我只提供了REST扩展的例子,因为你的问题是关于服务器端的JavaScript,我想你可能会有额外的需求。

+0

谢谢Sam的这种阐述......非常有用...... –

2

您不必循环。以下应该可以帮助您为您的需要:

myArray.push(fn.doc(fn.collection(“我的用户”)))