如何 return JSON 文档的集合作为 JSON 数组

How to return a collection of JSON documents as a JSON array

我在 MarklLogic 中收集了 JSON 个文档,我想将其 return 作为 JSON 数组调用 API。

fn.collection('my-users')

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

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

var myArray = [];

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

myArray

我是否需要遍历序列中的每个项目以推送到数组,或者是否有更多 elegant/quicker 解决方案?

雨果

如果您需要 return 它们作为 JSON 数组,那么您做对了。据我所知,没有更多的 elegant/quicker 解决方案。但是,如果您正在寻找一种更优化/高性能的方式,请尝试 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,我认为你可能有其他要求。

Iterables 来自 ES6,并且(据我所知)是 SJS 初始版本与子序列一起保留的唯一内容之一。

这样做的原因是您可以获得与 xQuery 中的序列和子序列相同的行为。 (两种语言的表示法不同,但行为相同)

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

但是,如果没有那个功能,那么我认为你使用的是最高效的方式。但请注意,不要将整个数据库从迭代器推送到数组,从而将整个数据库吸进内存。

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

-大卫

您不必循环播放。以下内容应该可以帮助您满足您的需要:

myArray.push(fn.doc(fn.collection('my-users')))