【问题标题】:How to return a collection of JSON documents as a JSON array如何将 JSON 文档的集合作为 JSON 数组返回
【发布时间】:2016-07-05 05:39:03
【问题描述】:

我在 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

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

雨果

【问题讨论】:

  • 不清楚您的要求。输出应该是什么样的?您想要每个文档的 JSON 表示吗?文档是 JSON 还是 XML?此外,要获取带有示例的服务器端 JavaScript 函数的完整列表,请转到 docs.marklogic.com 并选择左上窗格中的“服务器端 JavaScript API”部分。大多数 XQuery 函数也可用于服务器端 JavaScript。
  • fn.collection('my-users').toArray() 是我需要的

标签: json marklogic serverside-javascript


【解决方案1】:

Iterables 来自 ES6,并且(据我了解)是 SJS 初始版本与子序列一起继承的唯一内容之一。

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

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

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

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

-大卫

【讨论】:

  • 它实际上是iterable,而不是iterator。区别很微妙,但很重要。在我们支持 Array.from()(即将推出)之前,ValueIterator.prototype 上还有 .toArray() 方法。
  • 感谢贾斯汀的澄清。 “(即将推出)”听起来令人兴奋 - 迫不及待地想看看与 SJS 相关的其他事情......@Hugo - 请参阅贾斯汀关于 .toArray() 的评论......
  • 贾斯汀的回答是我的意图。所以我会接受大卫的回答。
【解决方案2】:

您不必循环。以下内容应能满足您的需要:

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

【讨论】:

    【解决方案3】:

    如果您需要将它们作为 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 的,我认为您可能有其他要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      相关资源
      最近更新 更多