文档模型(JSON)使用介绍
2019独角兽企业重金招聘Python工程师标准>>>
一、背景
E.F.Codd在1970年首次提出了数据库系统的关系模型,从此开创了数据库关系方法和关系数据理论的研究,为数据库技术奠定了理论基础,数据库技术也开始蓬勃发展。而随着几大数据库厂商陆续发布的商业数据库管理系统几乎都支持关系数据模型,数据库技术逐渐统一到以关系型数据库为主导。
2001年后,互联网技术迅速发展,数据量迅速膨胀并并大,人类逐步进入大数据时代。大数据给传统的数据管理方式带来了严峻的挑战,关系型数据库在容量,性能,成本等多方面都难以满足大数据管理的需求。NoSQL数据库通过折中关系型数据库严格的数据一致性管理,在可扩展性、模型灵活性、经济性和访问性等方面获得了很大的优势,可以更好地适应大数据应用的需求,成为大数据时代最重要的数据管理技术。
二、产品介绍
SequoiaDB是新一代分布式文档类数据库,其数据模型为文档模型(JSON),而非传统的关系型数据模型。关系模型以二维表来表示实体与实体之间的联系,在数据建模时需要对数据对象进行拆分,再将各自的信息存到对应的表里,在需要时再将各个表连接起来。而巨杉数据库以一个文档为单位进行存储,支持数组和文档嵌套,关系模型中需要拆分的信息可以直接用一个文档来表示。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript的一个子集,为纯文本格式,支持嵌套结构与数组。
JSON 具有如下形式:
1、对象是一个无序的“键值对”集合,以“{”(左大括号)开始,“}”(右大括号)结束。每一个元素名后跟一个“:”(冒号);而元素之间使用“,”(逗号)分隔;
2、数组是值的有序集合,以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔;
3、值可以为由双引号包裹的字符串,数值,对象,数组,true,false,null,以及 SequoiaDB 数据库特有的数据结构(例如日期,时间等)组成。
三、场景设计
文档模型应用场景非常广泛,这里以一个大家比较熟悉且经常会用到的一个场景——购物车为例,介绍文档模型的使用。
购物车是网上购物时存放感兴趣商品的虚拟篮子,打开购物车,通常希望看到各个商品的概要信息,如所属店铺名称、商品名称、价格、数量等,若商品是服装,可能还需要展示尺码、颜色等属性信息。
当我们用文档模型来表达购物车应用时,一种参考数据模型如下所示:
|
每个用户都对应一个文档,文档中由用户标识、状态及购物车物品几个字段,其中购物车是一个嵌套文档,里面包含对应用户购物车中的商品。每个商品都具有名称、价格、数量等信息,还可以根据需要为不同种类商品添加不同字段,比如这里的“attribute”字段,用于存放服装类商品的属性信息,如颜色、尺码,当然,同类商品可以具有不同个数、不同内容的属性信息,可以非常灵活地处理。
四、JSON API实现
对于一个购物车,常见的操作有:增加商品、删除商品、增加商品数量、修改商品属性、商品统计。在文档模型下,我们提供与之对应的一套完善的API来表示跟购物车相关的一系列操作。
4.1 增加商品
当我们希望在购物车中增加一本价格为99元的书时,可以使用如下的update语句:
|
其中,{uid:123456}为更新的匹配条件,表示用户标识为123456的用户,$push表示在数组末尾增加一个元素。$push的语法为:
|
$push 将给定数值(<值1>)插入到目标数组(<字段名1>)中,操作对象必须为数组类型的字段。
4.2 删除商品
如果希望从购物车中删除特定的商品,也可以使用update语句。与增加商品使用更新符$push不同的是,删除购物车中商品使用的是$pull更新符,其对应语句为:
|
同样的,{uid:123456}为更新的匹配条件,表示用户标识为123456的用户。$pull表示从数组中清除匹配的数组元素。
$pull的语法为:
|
$pull清除指定数组对象(<字段名1>,<字段名2>,...)的指定值(<值1>,<值2>,...)。操作对象必须为数组类型的字段。如果记录中不存在指定的数组对象,跳过不做任何操作;如果指定的值不存在数组对象中,也不做任何操作。
另外,巨杉数据库支持$replace语法,在不改变_id(由数据库自动生成的唯一标识)的情况下,改变文档内容,对应的语句为:
|
修改前后的效果为:
注意,这里在使用find时使用了两个JSON对象作为参数,这是巨杉数据库find函数的特殊语法,前一个JSON对象表示的是查询条件,代表用户标识uid为123456,第二个JSON对象表示的是selector,它控制返回结果的字段,可以理解为标准SQL语法中select语句后面的字段名,表示返回结果中只需要包含select后面的指定的字段。
$replace语法为:
|
$replace操作是将文档全部替换成"{<字段名1>:<值1>,<字段名2>:<值2>,...}"。除了保留原始的 _id 之外,原始文档的内容会全部清空,并替换成"{<字段名1>:<值1>,<字段名2>:<值2>,...}"。
4.3 增加商品数量
当我们需要修改购物车中某一商品的数量时,可以使用update语句搭配特定的更新符来完成。实现语句为:
|
这里使用了更新符$inc,表示给购物车中第一个商品的amount增加1,注意这里表示购物车中第一个商品的语法:items.0.amount,其中,0表示购物车中商品的序数,数组元素从0开始计数。
$inc的语法为:
|
$inc 操作是给指定“<字段名>”增加指定的“<值>”。
修改购物车中商品数量除了可以通过$inc来实现外,还可以使用$set来做,$set语法为:
|
$set操作是将指定的“<字段名>”更新为指定的“<值>”。
4.4 商品统计
对于某一个用户的购物车中的商品,如何获取购物车中的商品总数呢?或者当买家在准备结账时选择了多个商品时,如何在数据库中获取所选商品的数量和总价格呢?要获取这些信息,需要借助JavaScript代码来实现。
通过这种方式,可以得到购物车中每一件商品的单价、数量等信息,根据不同的应用需求,可以在数据库中方便的查询商品的信息并进行处理。
五、结论
SequoiaDB采用JSON定义的数据模型(对象存储),将程序中的对象以原生的方式保存在数据库中,并且可以对其中而已属性或子对象进行检索匹配,可以大幅度弱化复杂的关系模型,加快应用的开发速度,并减少系统的运维成本。
SequoiaDB巨杉数据库2.6最新版下载
SequoiaDB巨杉数据库技术博客
SequoiaDB巨杉数据库社区
转载于:https://my.oschina.net/wangzhonnew/blog/830082
文档模型(JSON)使用介绍相关推荐
- 由各大企业移除MongoDB,回看关系模型与文档模型之争
作者:陌北有棵树,Java人,架构师社区合伙人! 本月初,macOS 平台的开源包管理系统 Homebrew 宣布 Homebrew-core 将移除 MongoDB 的支持 (详见:https:// ...
- Office文档模型深入---Outlook文档模型与开发实战(1)
简介 本篇为Office文档模型深入系列第4篇,原计划是Excel的图表,之后是Word,因为项目转手需要总结Outlook,先改变下顺序,后面的内容会慢慢补上.本篇为Outlook子系列的第一篇 ...
- Java 中的 XML:Java 文档模型的用法
Java 中的 XML:Java 文档模型的用法 英文原文 内容: 代码对比 DOM JDOM dom4j Electric XML XPP 结束语 下一次... 参考资料 关于作者 对本文的评价 相 ...
- 文本挖掘 - 文档模型
文档模型,主要针对的是如何把文档数字化.向量化,最终可以利用这些文档来建立模型.当前文档模型主要包括三类:布尔模型,向量空间模型,概率模型. 1. 布尔模型 每个词在文档中出现则记为1,否则记为0.这 ...
- 文档模型 TMX 1.4b
文档模型 TMX 1.4b TMX 1.4b | GALA Global (gala-global.org) 26 April 2005 <?xml version="1.0" ...
- 文档型数据库mongodb介绍2-副本集
一. 副本集介绍 之前的文章介绍了 mongodb主从 mongodb提供了另外一种 基于副本集的集群 该方式 是一主一从的升级版 一主多从, 仍然是主节点负责写入 从节点定时同步主节点数据 使用该 ...
- 给文档添加签名,介绍用iPhone的实例,安卓手机类似
环境:iOS 16 实现电子文档上的签名不是什么新鲜事,也不需要高级的技术,原理基本一致,就是菜单路径有所不同,故在此记录一下,不然容易忘记. 这里介绍的解决方法: 需要一个签名,背景要透明的 需要一 ...
- office 里的链接如何显示成图片_微软Office文档 | Office小程序介绍(一)
微软中国Office 365 for WeChat团队开发了四款好用方便的小程序--「微软Office文档」「微软听听文档」「微软AI识图」「微软海报」.它们的受众已经十分庞大,但相信仍旧有不少人与其 ...
- ElasticSearch获取多个文档Multi GET API介绍
#■同时获取多个文档信息 #■例子:获职index:bank和shakespeare下面 #. I0为1.2.3.4.15.6.28的文档信息 GET /bank/bank_account/1 GET ...
最新文章
- javascript语法糖_语法糖和JavaScript糖尿病
- java jvm调优面试题_【Java面试题第一期】有没有jvm调优经验?调优方案有哪些?...
- matlab中大括号的使用 { },可以装4维的数据
- 服务器上有图片但是app不显示不出来,网络app图片显示不出来的
- 从服务器上传和下载文件方法
- [你必须知道的异步编程]——异步编程模型(APM)
- 如何给数组用fill函数和memset函数给数组赋初值
- java发送html附件_Java发送邮件(图片、附件、HTML)
- 蓝桥杯 ALGO-22算法训练 数的划分
- 微服务 前台调用后台的慢的原因_也只有阿里P8出身的他能把SpringCloud微服务架构商城项目整的这么干了...
- 51Nod - 1385 凑数字
- 群接龙,JK上报一键化手机脚本autojs
- Java后端开发的浪漫~情人节表白/告白代码(小白快速搭建项目)
- 代理服务器的常用端口有哪些?
- 拓展显示器分辨率模糊(亲测,超级有用)
- 编写代码的「八荣八耻」(上篇)
- 泰拉瑞亚服务器config修改,泰拉瑞亚种子世界游戏配置修改教程
- windows7操作系统安装步骤(精简版)
- 原生js实现可切换式导航栏
- 【已解决】win10远程桌面连接报错:出现身份验证错误,要求的函数不受支持(CredSSP)