Marklogic学习 由浅入深(9)—— 第一个Marklogic应用(中)

摘要: 通过前面一节的介绍,你是否已经可以感受到Marklogic的强大,前端UI 工程师设计好页面,我们只需要一个XQuery文件就可以做到保存到数据库操作,本节继续通过实例来讲解Marklogic 8.

编码

后台管理员一般需要知道现存书籍的概况,因此还需要一个查询接口用于得到所有的图书信息,还需要一个界面展示这些信息。
首先需要一个service 来从数据库中获取书籍信息 findbook.xqy

xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";

let $dir := "/book/"
let $query := cts:and-query(cts:directory-query($dir,"infinity"))
let $results := cts:search(fn:doc(),$query)
let $books := element books {for $book in $results/book return 
    element book {
      attribute id {$book/@id},
      element title {$book/title/string()},
      element author {$book/author/string()},
      element page {$book/pages/string()}
    }
  }
return $books

此时,我们已经得到了所有书籍的数据,但是为了页面方便使用这些数据, 我们可以将这个XML输出转换为JSON格式。
使用json:transform-to-json函数可以方便地做json转换,选择custom做自定义转化,还需要将输出结果中的array告诉转换方法,不然在转换数组元素时,只能得到第一组数据。

let $config := json:config("custom") ,
        $_ := map:put( $config, "array-element-names", "book")
return 
      json:transform-to-json( $books, $config )

为了方便以后使用,还可以将转化功能封装成函数,最终修改后的 findbook.xqy

xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
import module namespace json="http://marklogic.com/xdmp/json"
 at "/MarkLogic/json/json.xqy";

declare function local:xml-to-json($node as node(),$array-name as xs:string*){
    let $config := json:config("custom") ,
        $_ := map:put( $config, "array-element-names", $array-name)
    return 
      json:transform-to-json( $node , $config )
};

let $dir := "/book/"
let $query := cts:and-query(cts:directory-query($dir,"infinity"))
let $results := cts:search(fn:doc(),$query)
let $books := element books {for $book in $results/book return 
                            element book {
                              attribute id {$book/@id},
                              element title {$book/title/string()},
                              element author {$book/author/string()},
                              element page {$book/pages/string()}
                            }
                          }
return local:xml-to-json($books,("book"))

需要注意的是,json并不是Marklogic build-in 命名空间,使用时需要手动引入。定义$array-name 为 xs:string*类型,因为这一参数有可能传人多个。
展示书籍信息的界面很简单,只需要列出刚查询到的数据即可:
首先有一个展示基础界面:showbooks.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Books Information</title>
</head>
<body>
<h2 align="center">books Information</h2>
<table align="center" id="details">
    <tr>
        <th>I D</th>
        <th>标题</th>
        <th>作者</th>
        <th>页数</th>
    </tr>
</table>
</body>
<script type="text/javascript" src="jquery-1.7.2.js"></script>
<script type="text/javascript" src="showbook.js"></script>
</html>

我把展示信息的逻辑代码放到了js文件中 : showbook.js

$("document").ready(function (){
    $.ajax({
        url:"findbook.xqy",
        type:"get",
        dataType:"json",
        success:function(data){
            $.each(data.books.book, function(commentIndex, comment){
                $("#details").append(
                    "<tr>" +
                    "<td> <input type='text' value="+comment.id+"></td>" +
                    "<td> <input type='text' value="+comment.title+"></td>" +
                    "<td> <input type='text' value="+comment.author+"></td>" +
                    "<td> <input type='text' value="+comment.page+"></td>" +
                    "</td>"
                );
            });
        }
    });

})

这里使用jquery简化代码,使用ajax请求来获取数据,使用的url就是之前xquery方法。

执行

将findbook.xqy文件放到之前创建的workML目录下。
将showbook.html文件拷贝到workML目录下。
将showbook.js文件拷贝到workML目录下。
将jquery文件拷贝到workML目录下。
要确保这些文件在同一目录下。
workML
载浏览中访问http://localhost:8866/showbook.html,可以看到已经展示出了书籍信息。
book information

总结

通过两个例子的介绍,已经可以讲述清楚Marklogic在项目开发过程中,如果施展其能力。常用的方法莫过于增查改删,其中,最常使用的就是查询方法了,而Marklogic在这方面有着独特的优势。上面的例子中,查询方法并不复杂,结果类型可以方便转换。只要约定好数据结构,前后台开发可以完全分离。可以方便地定义函数,并调用。当然,这里我们没有考虑数据容量大小,如果有很多数据时,可以考虑分段查询,没有加入过滤条件,我们可以查询出只符合某些条件的数据,这些功能实现起来都很简单,在之后涉及到优化代码的时候,再举例说明。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cj96248

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值