如何将JSON文档集合作为JSON数组返回

时间:2016-03-18 12:49:51

标签: json marklogic serverside-javascript

我在MarklLogic中有一组JSON文档,我希望将其作为JSON数组返回到API调用。

fn.collection('my-users')

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

据我所知,没有真正的示例文档,仅在XQuery的一些示例中.Google一直在引用这个非常高级别的文档here

var myArray = [];

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

myArray

我是否需要遍历序列中的每个项目以推送到阵列或者是否有更优雅/更快速的解决方案?

雨果

3 个答案:

答案 0 :(得分: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

以下文档已插入my-users集合中(我假设您知道如何插入这些文档):

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,我想您可能还有其他需要的要求。

答案 1 :(得分:3)

Iterables来自ES6,并且(根据我的理解),SJS的初始版本以及子序列的唯一内容之一。

这样做的原因是,您获得与xQuery中的序列和子序列相同的行为。 (两种语言中的符号不​​同,但行为相同)

如果有完整的ES6实施,那么答案就是Array.from(iteratable)

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

我很好奇你的用例,实际上是在数组中需要它们。

-David

答案 2 :(得分:2)

你不必循环。以下内容可以帮助您满足您的需求:

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