我在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
我是否需要遍历序列中的每个项目以推送到阵列或者是否有更优雅/更快速的解决方案?
雨果
答案 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('我的用户')))