如何 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')))
我在 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')))