文档模型(JSON)使用介绍
一、背景
E.F.Codd在1970年首次提出了数据库系统的关系模型,从此开创了数据库关系方法和关系数据理论的研究,为数据库技术奠定了理论基础,数据库技术也开始蓬勃发展。而随着几大数据库厂商陆续发布的商业数据库管理系统几乎都支持关系数据模型,数据库技术逐渐统一到以关系型数据库为主导。
2001年后,互联网技术迅速发展,数据量迅速膨胀并并大,人类逐步进入大数据时代。大数据给传统的数据管理方式带来了严峻的挑战,关系型数据库在容量,性能,成本等多方面都难以满足大数据管理的需求。NoSQL数据库通过折中关系型数据库严格的数据一致性管理,在可扩展性、模型灵活性、经济性和访问性等方面获得了很大的优势,可以更好地适应大数据应用的需求,成为大数据时代最重要的数据管理技术。
二、产品介绍
SequoiaDB是新一代分布式文档类数据库,其数据模型为文档模型(JSON),而非传统的关系型数据模型。关系模型以二维表来表示实体与实体之间的联系,在数据建模时需要对数据对象进行拆分,再将各自的信息存到对应的表里,在需要时再将各个表连接起来。而巨杉数据库以一个文档为单位进行存储,支持数组和文档嵌套,关系模型中需要拆分的信息可以直接用一个文档来表示。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript的一个子集,为纯文本格式,支持嵌套结构与数组。
JSON 具有如下形式:
1、对象是一个无序的“键值对”集合,以“{”(左大括号)开始,“}”(右大括号)结束。每一个元素名后跟一个“:”(冒号);而元素之间使用“,”(逗号)分隔;
2、数组是值的有序集合,以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔;
3、值可以为由双引号包裹的字符串,数值,对象,数组,true,false,null,以及 SequoiaDB 数据库特有的数据结构(例如日期,时间等)组成。
三、场景设计
文档模型应用场景非常广泛,这里以一个大家比较熟悉且经常会用到的一个场景——购物车为例,介绍文档模型的使用。
购物车是网上购物时存放感兴趣商品的虚拟篮子,打开购物车,通常希望看到各个商品的概要信息,如所属店铺名称、商品名称、价格、数量等,若商品是服装,可能还需要展示尺码、颜色等属性信息。
当我们用文档模型来表达购物车应用时,一种参考数据模型如下所示:
{
"_id": {
"$oid": "57b44b2b2b57085321000001"
},
"items": [
{
"shopid": 8224,
"picture": "http://www.sequoiadb.com/product.jpg",
"amount": 1,
"price": "117.59",
"itemname": "Coffee",
"itemid": 194987
},
{
"shopid": 9291,
"attribute": [
{
"color": "Blue",
"size": "M"
},
{
"color": "Pink",
"size": "M"
}
],
"picture": "http://www.sequoiadb.com/product.jpg",
"amount": 2,
"price": "17.63",
"itemname": "T-shirt",
"itemid": 543514
}
],
"isactive": true,
"uid": 123456
}
每个用户都对应一个文档,文档中由用户标识、状态及购物车物品几个字段,其中购物车是一个嵌套文档,里面包含对应用户购物车中的商品。每个商品都具有名称、价格、数量等信息,还可以根据需要为不同种类商品添加不同字段,比如这里的“attribute”字段,用于存放服装类商品的属性信息,如颜色、尺码,当然,同类商品可以具有不同个数、不同内容的属性信息,可以非常灵活地处理。
四、JSON API实现
对于一个购物车,常见的操作有:增加商品、删除商品、增加商品数量、修改商品属性、商品统计。在文档模型下,我们提供与之对应的一套完善的API来表示跟购物车相关的一系列操作。
4.1 增加商品
当我们希望在购物车中增加一本价格为99元的书时,可以使用如下的update语句:
db.mall.cart.update({
$push:{
items:{
shopid:6666,
amount:1,
price:"99.00",
itemname:"Book",
itemid:206053
}
}
},
{
uid:123456
})
其中,{uid:123456}为更新的匹配条件,表示用户标识为123456的用户,$push表示在数组末尾增加一个元素。$push的语法为:
{
$push:{
<字段名1>:<值1>,
<字段名2>:<值2>,
...
}
}
$push 将给定数值(<值1>)插入到目标数组(<字段名1>)中,操作对象必须为数组类型的字段。
4.2 删除商品
如果希望从购物车中删除特定的商品,也可以使用update语句。与增加商品使用更新符$push不同的是,删除购物车中商品使用的是$pull更新符,其对应语句为:
db.mall.cart.update({
$pull:{
items:{
shopid:6666,
amount:1,
price:"99.00",
itemname:"Book",
itemid:206053
}
}
},
{
uid:123456
})
同样的,{uid:123456}为更新的匹配条件,表示用户标识为123456的用户。$pull表示从数组中清除匹配的数组元素。
$pull的语法为:
{
$pull: {
<字段名1>:<值1>,
<字段名2>:<值2>,
...
}
}
$pull清除指定数组对象(<字段名1>,<字段名2>,...)的指定值(<值1>,<值2>,...)。操作对象必须为数组类型的字段。如果记录中不存在指定的数组对象,跳过不做任何操作;如果指定的值不存在数组对象中,也不做任何操作。
另外,巨杉数据库支持$replace语法,在不改变_id(由数据库自动生成的唯一标识)的情况下,改变文档内容,对应的语句为:
db.mall.cart.update( {
$replace:{
uid:123456,
items:[{
itemid:5856,
itemname:"Cup",
amount:1,
price:"69.00",
shopid:8224
}
]
}
},
{
uid:123456
} )
修改前后的效果为:
修改前 |
修改后 |
db.mall.cart.find({uid:123456}, {_id:"",uid:"",items:""}) { "_id": { "$oid": "57b713de04bb569f27000002" }, "items": [ { "amount": 2, "itemid": 194987, "itemname": "Coffee", "picture": "http://www.sequoiadb.com/product.jpg", "price": "117.59", "shopid": 8224 }, { "amount": 1, "attribute": [ { "color": "Blue", "size": "M" }, { "color": "Pink", "size": "M" } ], "itemid": 543514, "itemname": "T-shirt", "picture": "http://www.sequoiadb.com/product.jpg", "price": "17.63", "shopid": 9291 } ], "uid": 123456 } |
db.mall.cart.find({uid:123456}, {_id:"",uid:"",items:""}) { "_id": { "$oid": "57b713de04bb569f27000002" }, "items": [ { "itemid": 5856, "itemname": "Cup", "amount": 1, "price": "69.00", "shopid": 8224 } ], "uid": 123456 } |
注意,这里在使用find时使用了两个JSON对象作为参数,这是巨杉数据库find函数的特殊语法,前一个JSON对象表示的是查询条件,代表用户标识uid为123456,第二个JSON对象表示的是selector,它控制返回结果的字段,可以理解为标准SQL语法中select语句后面的字段名,表示返回结果中只需要包含select后面的指定的字段。
$replace语法为:
{
$replace:{
<字段名1>:<值1>,
<字段名2>:<值2>,
...
}
}
$replace操作是将文档全部替换成"{<字段名1>:<值1>,<字段名2>:<值2>,...}"。除了保留原始的 _id 之外,原始文档的内容会全部清空,并替换成"{<字段名1>:<值1>,<字段名2>:<值2>,...}"。
4.3 增加商品数量
当我们需要修改购物车中某一商品的数量时,可以使用update语句搭配特定的更新符来完成。实现语句为:
db.mall.cart.update({
$inc:{
"items.0.amount":1
}
},
{
"uid":123456
})
这里使用了更新符$inc,表示给购物车中第一个商品的amount增加1,注意这里表示购物车中第一个商品的语法:items.0.amount,其中,0表示购物车中商品的序数,数组元素从0开始计数。
$inc的语法为:
{
$inc:{
<字段名1>:<值1>,
<字段名2>:<值2>,
...
}
}
$inc 操作是给指定“<字段名>”增加指定的“<值>”。
修改购物车中商品数量除了可以通过$inc来实现外,还可以使用$set来做,$set语法为:
{
$set:{
<字段名1>:<值1>,
<字段名2>:<值2>,
...
}
}
$set操作是将指定的“<字段名>”更新为指定的“<值>”。
4.4 商品统计
对于某一个用户的购物车中的商品,如何获取购物车中的商品总数呢?或者当买家在准备结账时选择了多个商品时,如何在数据库中获取所选商品的数量和总价格呢?要获取这些信息,需要借助JavaScript代码来实现。
JSON文档 |
实现代码 |
{ "_id": { "$oid": "57b718c204bb569f27000003" }, "isactive": true, "items": [ { "amount": 2, "itemid": 194987, "itemname": "Coffee", "picture": "http://www.sequoiadb.com/product.jpg", "price": "117.59", "shopid": 8224 }, { "amount": 1, "attribute": [ { "color": "Blue", "size": "M" }, { "color": "Pink", "size": "M" } ], "itemid": 543514, "itemname": "T-shirt", "picture": "http://www.sequoiadb.com/product.jpg", "price": "17.63", "shopid": 9291 } ], "uid": 123456 } |
> var query = db.mall.cart.find({uid:123456}) > var record = query.next().toObj() > record['items'].length 2 说明: 用户标识uid为12345的用户的购物车中包含两种商品。 > record['items'][0].amount 2 说明: 购物车中第一件商品的数量为2。 > record['items'][1].price 17.63 说明: 购物车中第二件商品的单价为17.63。 |
通过这种方式,可以得到购物车中每一件商品的单价、数量等信息,根据不同的应用需求,可以在数据库中方便的查询商品的信息并进行处理。
五、结论
SequoiaDB采用JSON定义的数据模型(对象存储),将程序中的对象以原生的方式保存在数据库中,并且可以对其中而已属性或子对象进行检索匹配,可以大幅度弱化复杂的关系模型,加快应用的开发速度,并减少系统的运维成本。
文档模型(JSON)使用介绍的更多相关文章
- DOM浏览器文档模型
DOM浏览器文档模型 1.对XHM/XHTML 编写成DOM文档 可形成动态网页 2.'*'获取所有节点 GetElementsByTagName():获取所有的标签名的集合--需要在js中使用win ...
- 基础:从概念理解Lucene的Index(索引)文档模型
转:http://blog.csdn.net/duck_genuine/article/details/6053430 目录(?)[+] Lucene主要有两种文档模型:Document和Fi ...
- Winform开发框架中的内容及文档管理模块功能介绍
在开发项目的时候,我们有一些场景需要编辑一些HTML文档,作为内容发布系统的一部分,有时候也需要对一些文档如WORD文档进行编辑管理,这样需要我们对这些内容及文档进行合适的管理.本文主要介绍在WInf ...
- IE 文档模型设置 免去你IE 按F12去调文档标准的烦恼。
英文原文:http://msdn.microsoft.com/en-us/library/cc288325(VS.85).aspx 最近在做一个前端页面,在各种浏览器上,各种差异,各种无赖.各种郁闷. ...
- MongoDB系列一:MongoDB文档型数据库特点介绍
一.MongoDB数据库的存储特点: 1.MongoDB是文档型数据库,存储的是文档(将json二进制化为Bson存储): 2.存储的每篇文档都可以有自己独特的存储结构,颠覆了传统数据库必须按照表和列 ...
- 第三十章、containers容器类部件QMdiArea多文档界面部件功能介绍及开发应用
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 老猿在前期学习PyQt相关知识时,对每个组件的属性及方法都研 ...
- Dom文档模型
文档对象模型 通过 JavaScript,您可以重构整个 HTML 文档.您可以添加.移除.改变或重排页面上的项目.要改变页面的某个东西,JavaScript 就需要获得对 HTML 文档中所 ...
- 有效的XML: DTD(文档类型定义)介绍(转)
文档类型定义和命名空间 有效(Valid)的XML文档: 首先,XML文档是个格式正规的(Well-formed)XML文档:(见格式正规的XML:语法 属性 实体 处理指令 样式单 CDATA节). ...
- 阅读MDN文档之CSS选择器介绍(一)
本文为阅读MDN文档笔记 目录 Different types of Selectors Attribute Selectors Presence and value attribute select ...
随机推荐
- 单片机IAP学习
1.IAP是什么--简介 IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可 ...
- spring boot无法启动,或者正常启动之后无法访问报404的解决办法
以前用spring boot都是用idea的自动创建,或者是用的Jhipster创建的,就没有深究怎么去搭建.但是今天晚上心血来潮,想自己搭一个demo来整合一些技术,于是就花一点时间来手动搭.因为今 ...
- Jmeter 初学(一)
Jmeter 目前属于比较流行的测试工具,即可做自动化测试也可以做性能测试,而且比较方便. 环境准备: Jmeter 运行环境需要跑在java环境,首先需要安装一下java的环境,由于我目前使用的Jm ...
- 高性能mysql(二)——mysql的存储引擎
在文件系统中,mysql将每个数据库保存为数据目录下的一个子目录.创建表时,mysql会在子目录下创建一个和表同名的.frm文件保存表的定义.例如创建一个名为mytable的表,mysql会在myta ...
- Junit 入门使用教程
1.Junit 是什么? JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个JU ...
- Java IO流学习总结(1)
Java IO流学习总结 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本 ...
- RabbitMQ_安装配置与管理
RabbitMQ 安装配置与管理 安装 安装erlang虚拟机 Rabbitmq基于erlang语言开发,所有需要安装erlang虚拟机 #wget http://www.erlang.org/do ...
- git使用简易指南
安装 下载 git OSX 版 下载 git Windows 版 下载 git Linux 版 创建新仓库 创建新文件夹,打开,然后执行 git init 以创建新的 git 仓库. 检出仓库 执行如 ...
- R语言进行文件夹操作示例(转)
rm(list=ls())path = 'J:/lab/EX29 --在R语言中进行文件(夹)操作'setwd(path)cat("file A\n", file="A& ...
- SpringMVC 整合Jackson报错
最近用spring4.x整合Jackson,结果莫名其妙的一直报错,网上收索的结果都是在maven或者gradle的环境下配置依赖条件解决的:但是eclipseIDE环境下的jar包应该是会自动依赖影 ...