CouchDB 无架构灵活性

268 阅读3分钟

无架构灵活性

CouchDB 完全能够在单个数据库中存储两个具有不同字段集的文档。

这有很多优点,尤其是在以下情况下:

  • 稀疏数据集可以有效地存储,因为根本不需要存储空字段。

  • 随着文档的发展,添加额外的字段是微不足道的。

除了添加和删除 字段 本身之外,对于字段可以保存的数据类型也没有任何强有力的规则。因此,存储字符串值的 字段 也可以保存一个整数。它甚至可以将数组类型作为值。这意味着您不必担心强类型。但另一方面,这意味着您的应用程序需要确保数据经过验证,并且在语义上值是一致的。

为了演示这种灵活性的其他一些方面,接下来使用MongoDB作为例子:

首先,创建一个MongoDB 集合命名 contacts 并将两个文档添加到集合中。

您可以通过启动MongoDB并按如下顺序执行以下命令来执行此操作:

use mydb

db.contacts.insert({ name:"John Doe",organization:"Great Co", email:"john.doe@example.com"});

db.contacts.insert({ name:"Wei Chin", company:"work well", phone:"123-456-7890" });

接下来,确认集合已创建且两个文档位于其中。您可以通过简单地列出文档进行验证,如下所示:

db.contacts.find(); 

此查询的结果应如下所示:

{ "_id" : objectId("4d2bbad6febd3e2b32bed964"), "name" :"John Doe", "organization" : "Great Co", "email" :"john.doe@example.com"}

{ "_id" : objectId("4d2bbb43febd3e2b32bed965"), "name" : "Wei Chin", "company": "Work well", "phone": "123-456-7890" }

The_id值可能会有所不同,因为这些是我的系统上 MongoDB 生成的值,并且肯定会因实例而异。现在,您可以向与“Wei Chin”相关的文档添加一个附加字段,电子邮件,如下所示:

var doc=db.contacts.findone({_id:objectid("4d2bbb43febd3e2b32bed965")});

doc.email="wei.chin@example.com";

db.contacts.save(doc);

我使用the_id来获取文档,然后简单地为电子邮件字段分配一个值,然后保存文档。要验证现在是否添加了新字段,只需再次从联系人集合中获取文档,如下所示:


db.contacts.find(); 

响应应如下所示:

{"_id" : objectId("4d2bbad6febd3e2b32bed964"), "name":"John Doe", "organization" : "Great Co", "email":"john.doe@example.com"}

{"_id" : objectId("4d2bbb43febd3e2b32bed965"), "name" : "Wei Chin", "company": "Work Well", "phone" : "123-456-7890", "email" : "wei.chin@example.com"}

与 CouchDB 不同,MongoDB 不维护文档版本,更新会在适当的位置修改文档。

现在,假设您有另一个名为 contacts 2的集合,它有更多的联系人文档,您需要将这两个集合,contact 和 contacts 2合并为一个。你会怎么做?不幸的是,目前还没有合并集合的神奇按钮或命令,但是用您选择的语言编写一个快速脚本来合并两个集合并不是非常困难。在设计合并脚本时,可以考虑以下几点:

  • 具有可能的覆盖、更新或复制值的开关可以决定如何合并两个不同集合中具有相同 _ id 的两个文档。两个文档在一个集合中不能具有相同的 _ id 值。覆盖意味着第二个集合中的文档覆盖第一个集合中的相应文档。更新和复制将定义替代的合并策略。

  • 基于the_id以外的字段进行合并。

  • 合并 MongoDB 集合的 ruby 脚本可以通过一个名为 mongo-tools 的项目获得,该项目地址为:github.com/tshanky/mon…


本文正在参加「金石计划 . 瓜分6万现金大奖」