通天战队|「文档数据库之争」MongoDB和CouchDB的比较( 二 )

  • CouchDB使用身份验证验证插入到数据库中的数据 , 以验证创建者和登录会话id是否相同 。

  • 通天战队|「文档数据库之争」MongoDB和CouchDB的比较CouchDB架构
    REST API用于编写和查询数据 。 它还提供文档读取、添加、编辑和删除功能 。 它通过MVCC实现使用ACID模型而不是BASE 。 就像MongoDB支持设备离线时的复制一样 。 它使用一种称为最终一致性的特殊复制模型 。 CouchDB在数据方面是高度可靠的 。 单节点数据库使用仅追加的抗崩溃数据结构 , 而多模式或集群数据库可以冗余地保存数据 , 以便在用户需要时提供数据 。 CouchDB可以根据大集群(如全球集群)扩展到小集群(如移动设备) 。 CouchDB能够在任何Android或iOS设备上运行 , 这使得它在其他数据库中脱颖而出 。
    CouchDB体系结构是分布式的 , 支持双向同步 。 由于使用唯一id , 它不需要任何模式 。 尽管CouchDB遵循CAP模型的AP(可用性和分区容错)特性 , 但为了克服交易一致性 , 它在实际基础上遵循ACID模型 。
    CouchDB和MongoDB的比较
    通天战队|「文档数据库之争」MongoDB和CouchDB的比较CouchDB和MongoDB:截然不同的查询CouchDB和MongDB都是面向文档的数据存储 , 它们使用JSON文档 , 但是当涉及到查询时 , 这两个数据库就完全不同了 。 CouchDB需要预定义的视图(本质上是JavaScript的MapReduce函数) , MongoDB支持动态查询(基本上是我们习惯的常规RDBMS特别SQL查询) 。
    例如 , 为了使用Groovy的RESTClient在CouchDB中插入一些数据 , 并发出一个RESTful post , 如下所示:
    import static groovyx.net.http.ContentType.JSON
    import groovyx.net.http.RESTClient
    def client = new RESTClient("http://localhost:5498/")
    response = client.put(path: "parking_tickets/1280002020",
    contentType: JSON,
    requestContentType: JSON,
    body: [officer: "Micheal Jordan",
    location: "189 Berkely Road",
    vehicle_plate: "KL5800",
    offense: "Parked in no parking zone",
    date: "2020/02/01"])
    示例代码查询任何官员财产为“Micheal Jordan”的文件的函数:
    function(doc) {
    if(doc.officer == "Micheal Jordan"){
    emit(null, doc);
    }
    }
    当我们发出一个HTTP GET请求到那个视图的名字 , 我们可以期望至少一个文档如下:
    response = client.get(path: "parking_tickets/_view/by_name/officer_grey",
    contentType: JSON, requestContentType: JSON)
    assert response.data.total_rows == 1
    response.data.rows.each{
    assert it.value.officer == "Micheal Jordan"
    }
    MongoDB的工作方式很像我们习惯使用的普通数据库:我们可以在运行时查询我们内心想要的任何东西 。
    使用MongoDB的本地Java驱动程序插入停车罚单的相同实例:
    DBCollection coll = db.getCollection("parking_tickets");
    BasicDBObject doc = new BasicDBObject();
    doc.put("officer", "Micheal Jordan");
    doc.put("location", "189 Berkely Road ");
    doc.put("vehicle_plate", "KL5800");
    //...
    coll.insert(doc);
    只需对警官的财产进行查询 , 即可查询警官Micheal Jordan从MongoDB发出的任何罚单:
    BasicDBObject query = new BasicDBObject();
    query.put("officer", "Micheal Jordan");
    DBCursor cur = coll.find(query);
    while (cur.hasNext()) {