zoukankan      html  css  js  c++  java
  • couchDB文档

    每个文档都是自包含的数据单元,是一系列数据项的集合。 每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。 每个文档都有一个全局惟一的标识符(ID)以及一个修订版本号(revision number)。

    存储格式:JSON

    字段解释

    _id : 全局惟一的标识符,用来惟一标识一个文档; 
    _rev : 修订版本号,用来实现多版本并发控制(Multiversion concurrency control,MVVC); 
    _attachments : 内嵌型附件,以 base64 编码的格式作为文档的一个字段保存;

    最简单的文档结构

    文档中至少要包含_id和_rev字段,示例如下:

    {
       "_id": "5fecc0d7fe5acac6b46359b5eeefb614",
       "_rev": "1-967a00dff5e02add41819138abb3284d"
    }
    

    couchDB设计文档

    设计文档是一类特殊的文档,其ID必须以_design/开头。 设计文档的存在是使用CouchDB开发Web应用的基础。 在CouchDB中,一个Web应用是与一个设计文档相对应的。 
    在设计文档中可以包含一些特殊的字段,其中包括:

    views 包含永久的视图定义; 
    shows 包含把文档转换成非JSON格式的方法; 
    lists 包含把视图运行结果转换成非JSON格式的方法; 
    validate_doc_update 包含验证文档更新是否有效的方法。

    设计文档结构 :

    { "_id" : "_design/${docName}", "_rev" : "${revision}",

    "language" : "javascript",
    
    "views": {
        ...
    }
    
    "shows": {
        ...
    }
    
    "lists": {
        ...
    }
    
    "_attachments": {
        ...
    }
    

    }

    最简单的设计文档结构

    {
        "_id" : "_design/example",
        "views" : {
            "foo" : {
            "map" : "function(doc){ emit(doc._id, doc._rev)}"
            }
        }
    }
    

    views字段

    包含永久的视图定义。

    具体参考文档:couchDB视图

    shows字段

    基本格式

    {
        "_id": "_design/examples",
        "shows": {            
            "people": "function(doc, req) { /*...*/ }"
        }
    }
    

    show方法

    示例代码:

    function(doc, req) {
      return {
        body: "Hello World"
      }
    }
    

    每个show方法都可以有两个参数:doc和req 
    其中doc表示的是与请求的文档ID对应的文档内容, 而req则表示与当前请求相关的内容,是一个JSON对象。该JSON对象参数如下:

    body    对于 GET 请求来说,该属性的值是undefined;对于 POST/PUT 请求来说,该属性的值是请求的内容。
    cookie  该属性表示浏览器端的 cookie 。
    form    如果请求的内容类型(Content Type)是application/x-www-form-urlencoded的话,该属性包含解码之后的 JSON 对象。
    info    该属性包含所请求的 CouchDB 数据库的信息。
    path    该属性是一个数组,表示请求的路径。
    query   该属性包含对请求的查询字符串解码之后的 JSON 对象。
    verb    该属性表示 HTTP 请求的方法,一般是 GET/POST/PUT/DELETE 。
    

    这里需要注意的是请求中的文档 ID 与 show 方法的参数doc的关系,具体的情况如下:

    请求中传入了文档 ID,并且数据库中存在与此 ID 对应的文档:这种情况下,doc的值就是此 ID 对应的文档内容。 
    请求中传入了文档 ID,但是数据库中没有与此 ID 对应的文档:这种情况下,doc的值是null,可以通过req.docId获取此 ID 。一般的行为是创建 ID 为req.docId的文档。 
    请求中没有传入文档 ID:这种情况下,doc和req.docId的值都为null。一般的行为是由 CouchDB 生成一个 ID,并创建文档。

    show方法都需要返回一个包含了 HTTP 响应信息的 JSON 对象。该 JSON 对象中可以包含以下几个字段:

    code    该属性表示 HTTP 响应的状态代码,默认是 200 。
    headers 该属性表示 HTTP 响应的头,是一个 JSON 对象,如{"Content-Type" : "application/xml"}。
    json    设置该属性表示把一个 JSON 对象发送给客户端。
    body    设置该属性表示把一个任意的字符串发送给客户端。
    base64  设置该属性表示把 base64 编码的二进制数据发送给客户端。
    

    表示 HTTP 响应内容的json、body和base64只需要设置一个即可。

    访问语法

    GET /db/_design/examples/_show/people/doc_id
    GET /db/_design/examples/_show/people/doc_id?format=xml&details=true
    

    lists字段

    list方法用来把视图转换成非JSON格式。 由于视图的运行结果包含多行数据,list方法需要迭代每行数据并分别进行格式化,因此对于一个视图的运行结果,list 方法会被多次调用。 list方法的调用过程是迭代之前调用一次,对结果中的每行数据都调用一次,最后在迭代之后再调用一次。

    基本格式

    {
        "_id": "_design/examples",
        "views" {
            "posts-by-date": {"map": "function(doc){ /*...*/ }"},
            "posts-by-tag": {"map": "function(doc){ /*...*/ }"},
            "people-by-name": {"map": "function(doc) { /*...*/ }"}
        },
        "lists": {
            "index-posts": "function(head, req) { /*...*/ }",
            "browse-people": "function(head, req) { /*...*/ }"
        }
    }
    

    list方法

    每个list方法都可以有两个参数:head、req

    方法示例:

    function(head, req) {
      var row;
      start({
        "headers": {
          "Content-Type": "text/html"
        }
      });
      while(row = getRow()) {
        send(row.value);
      }
    }
    

    访问语法

    GET /db/_design/examples/_list/index-posts/posts-by-date?descending=true&limit=10
    GET /db/_design/examples/_list/index-posts/posts-by-tag?key="howto"
    GET /db/_design/examples/_list/browse-people/people-by-name?startkey=["a"]&limit=10
    

    示例代码

    文档代码:
    
    {
       "_id": "_design/example",
       "views": {
           "foo": {
               "map": "function(doc){ emit(doc._id, doc._rev)}"
           }
       },
       "lists": {
           "index-posts": "function(head, req) {var row; start({"headers": {"Content-Type": "text/html"}});while(row = getRow()) {send(row.value);}}"
       }
    }
    
    curl代码:
    
    curl "http://127.0.0.1:5984/testdb2/_design/example/_list/index-posts/foo"

    本文github地址:

    https://github.com/mike-zhang/mikeBlogEssays/blob/master/2014/20141007_couchDB文档.md

    欢迎补充

  • 相关阅读:
    简单的C语言编译器--语法分析器
    简单的C语言编译器--词法分析器
    简单的C语言编译器--概述
    最短路径算法
    拓扑排序和关键路径
    图的连通性
    最小生成树
    图的搜索
    gcc O2优化选项对内嵌汇编以及函数递归调用的影响
    gcc 在c代码中内嵌汇编调用c函数: 只是证明曾经我来过
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/couchdbDoc20141007.html
Copyright © 2011-2022 走看看