Nosql CRUD 创建操作-创建记录

460 阅读6分钟

创建、读取、更新和删除(通常称为 CRUD)这组基本操作是与任何数据交互的基本方式。

因此,了解这些操作如何应用于NoSQL非常重要。NoSQL不是一个单一的产品或技术,而是一类数据库的总称;因此,CRUD操作的含义因NoSQL产品而异。但是,它们都有一个共同的主要特征:

在NoSQL存储中,创建和读取操作比更新和删除操作更重要,以至于有时这些操作是唯一的操作。

CRUD 的第一个支柱是创建操作

创建记录

记录创建操作几乎不需要定义。首次需要保存新记录时,请创建一个新条目。这意味着应该有一种方法可以轻松识别记录并找出它是否已经存在。如果是这样,您可能希望更新记录而不是重新创建它。

在关系数据库中,记录存储在表中,其中称为主键的键唯一标识每条记录。当您需要检查记录是否已存在时,您可以检索相关记录的主键,并查看表中是否存在该键。如果记录没有主键的值,但它为表中的每一列或字段保存的值与现有记录的相应值完全匹配,该怎么办?这就是事情变得棘手的地方。

关系数据库坚持关系模型的支持者E.F.Codd引入的规范化原则。E.F. Codd 和 Raymond F. Boyce 在 1974 年将 Boyce-Codd 范式 (BCNF) 放在一起,该范式通常被视为保持数据库模式规范化的最低预期级别。非正式地说明,规范化架构试图减少修改

通过仅存储一次数据并在必要时创建对关联数据的引用,记录集中出现异常。

在规范化架构中,具有相同值的两条记录是同一记录。所以有一个

隐式按值比较,它编纂在关系模型中的单个列(主键)中。在编程语言,尤其是面向对象语言的世界中,这种身份概念经常被引用比较语义所取代,其中作为对象存在的唯一记录集由它所寻址的内存空间唯一标识。由于 NoSQL 包含类似于传统表格结构和对象存储的数据库,因此标识语义从基于值到基于引用不等。但是,在所有情况下,唯一主键的概念都很重要,并且有助于标识记录。

尽管大多数数据库允许您为唯一记录键选择任意字符串或字节数组,但它们通常会规定一些规则来确保此类键是唯一且有意义的。在某些数据库中,可以使用实用程序函数来生成主键。

了解记录标识符后,下面介绍如何在几个 NoSQL 数据库中创建记录。

在以文档为中心的数据库中创建记录

许多关系数据库示例中使用的典型示例是简化的零售系统,该系统创建和管理订单记录。每个人在这个虚构的商店购买都是一个订单。订单由一堆订单项组成。每个订单行项目都包括一个产品(一个项目)和所购买产品的单位数量。订单项还具有价格属性,即通过将产品的单价乘以购买的单位数量来计算。每个订单表都有一个关联的产品表,用于存储产品描述和有关产品的一些其他属性。

下图描述了传统实体关系图中的订单、产品及其关系表。

image.png

要将相同的数据存储在 MongoDB(文档存储)中,您需要对结构进行非规范化,并将每个订单行项目详细信息与订单记录本身一起存储。例子:

四种咖啡的订单:一种拿铁咖啡,一种卡布奇诺咖啡和两种普通咖啡。这个咖啡订单将作为嵌套的类似JSON的文档图存储在MongoDB中,如下所示:


{
    order_date:new Date(),

        "line_items":[

            {

                item:{

                        name:"latte",
                        unit_price:4.00
                }
            quantity:1
            },
    {
        item:{

            name:"cappuccino",
            unit_price:4.25
        },
        quantity:1 },

{

    item:{

        name:"regular", 
        unit_price:2.00 {

quantity:2 }

开命令行窗口,切换到 MongoDB 文件夹的根目录,然后启动 MongoDB 服务器,如下所示:

bin/mongod--dbpath~/data/db

现在,在单独的命令窗口中,启动命令行客户端以与服务器交互:

bin/mongo

使用命令行客户端将咖啡订单存储在 mydb 数据库中的订单集合中。

控制台上命令输入和响应的部分列表如下所示:

image.png

image.png

尽管建议存储整个嵌套文档集合,但有时需要单独存储嵌套对象。当嵌套文档单独存储时,可以将记录集联接在一起。MongoDB中没有数据库连接的概念,因此您必须使用客户端的对象ID手动实现连接操作,或者利用DBRef的概念。

您可以重新构建此示例,使其不将产品的单价数据存储在嵌套文档中,而是将其单独保存在另一个集合中,该集合存储有关产品的信息。在新格式中,项名称用作两个集合之间链接的键。因此,重组后的订单数据存储在名为 orders2 的集合中,如下所示:

image.png

image.png

验证数据是否正确存储,您可以返回 orders2 集合的内容,如下所示:

image.png

接下来,保存产品数据,其中存储了项目名称和单价,如下所示:

image.png

同样,您可以借助 find 方法验证产品集合中的记录:

image.png

现在,您可以手动链接两个集合并检索相关数据集,如下所示:

image.png

此手动过程的一部分可以在 DBRef 的帮助下自动化,DBRef 是用于关联两个文档集合的更正式的规范 MongoDB.To 说明 DBRef,您可以重新散列订单示例并通过首先定义产品,然后从订单集合中设置到 DBRef 来建立关系。

将拿铁、卡布奇诺和普通咖啡及其各自的单价添加到 product2 系列中,如下所示:

image.png

image.png

验证所有三个产品是否都在集合中:

image.png

接下来,定义一个名为 orders3 的新订单集合,并使用 DBRef 建立订单 3 和产品之间的关系。订单 3 集合可以定义如下:

image.png

MongoDB的创建过程相当简单,正如你所看到的,关系的某些方面也可以使用DBRef正式建立。