文档模型(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 ...
随机推荐
- React入门---开始前的准备(上)-2
开始前准备: 1.安装配置nodeJs(nodeJS官网) 检查安装成功: node -v npm -v 2.使用NPM配置React开发环境 (1). 创建项目文件夹(创建文件夹时,文件夹名不要起为 ...
- web 直播&即时聊天------阿里云、融云
随着直播越来越火,所在公司也打算制作自己的直播,所以去了解了这方面,使用后发现还是有些问题需要记录的. 经过分析,制作直播应该是分为两块来做,即直播与实时评论.这里先去制作实时评论,等直播ok后,也会 ...
- bitnami gitlab 配置域名
正常安装完成以后gitlab的代码仓库域名的地址依然是IP,这样不便于我们记忆,所以我想给gitlab增加一个域名 找到gitlab.yml 配置文件,在gitlab 节点下的host 由IP变更为域 ...
- 使用cmd来起一个服务器
第一步:安装Node.js 下载地址:https://nodejs.org/en/ 第二步:打开cmd,输入node -v 确认是否安装成功,成功后显示版本号如下: 第三步:输入命令:ndoe ins ...
- php.ini 文件中配置的意义注释
;;;;;;;;;;;;;;;;;;;; About php.ini ; //关于php;;;;;;;;;;;;;;;;;;;; PHP's initialization file, gener ...
- Log4net日志记录、详细配置(自己使用)
[来自百度百科的一句介绍]log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. 1.首先添 ...
- let与const详解
在ES6中,js首次引入了块级作用域的概念,而什么是块级作用域? 众所就知,在js当中存在预解析的概念,就是变量提升.并且只存在全局作用域和私有作用域.在全局定义的变量就是全局变量,而在函数内部定义的 ...
- 什么是ZigBee、Wifi无线技术?有什么优势?
Zigbee:是基于IEEE802.15.4标准的低功耗个域网协议.根据这个协议规定的技术是一种短距离.低功耗的无线通信技术.这一名称来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和"嗡嗡& ...
- Graphical Analysis of German Parliament Voting Pattern
We use network visualizations to look into the voting patterns in the current German parliament. I d ...
- Some 3D Graphics (rgl) for Classification with Splines and Logistic Regression (from The Elements of Statistical Learning)(转)
This semester I'm teaching from Hastie, Tibshirani, and Friedman's book, The Elements of Statistical ...