SDB笔记1
1. CRUD操作
1.1 插入 insert()
1.1.1 特点
a. 若插入数据未标明id字段,则客户端会自动填充唯一id字段
b. 插入数据的 _id 字段必须唯一不然会出现操作异常
c. 最大的插入记录BSON文档为16MB
d. 文档命名字段有明确归档
id字段的值必须唯一且不可变,其值可以是除了数组外的其他类型
字段命名不能有空串
字段名不能以$开始
字段名不能还有 '.'
e. 对于插入同一个集合中的数据字段可以不用匹配
1.1.2 具体案例
> var db = new Sdb("localhost", 11810) //获取数据库连接
> db.createCS("db1") //理解成创建数据库
> db.foo.createCL("tab1") //创建表
//向表中插入数据(Json对象)z指定 _id 字段
> db.db1.tab1.insert( { _id: 1, name: { fist: "Jhon", last: "Black" }, phone: [ 1853742000, 1802321000 ] } )
//不指定 _id 字段
> db.db1.tab1.insert( { name: "Tom", age: 20 } )
// 同时插入多条数据
> db.db1.tab1.insert( [ { name: "Mike", age: 15 }, { _id: 20, name: "John", age: 25, phone: 123 } ] )
1.2 查询 find()
1.1.1 特点
同 select相似
1.1.2 具体操作
> var db = new Sdb("localhost",11810) //获取数据库连接
> db.db1.tab1.find() //获取集合中所有记录
> db.db1.tab1.find( { age: 23 } ) //匹配集合中字段为age值为23的数据
> db.db1.tab1.find({ age: { $gt: 20 }}) //匹配符的运用
> db.db1.tab1.find( { "phone": 10086 } ) //数组中的数据匹配
> db.foo.bar.find( { "family":
{ $elemMatch: { "Dad": "Kobe", "phone": 139123456 } }
} ) //数组元素为对象的匹配
> db.foo.bar.find( { "name": { "$elemMatch": { "first": "Tom" } } } ) //嵌套对象的匹配
> db.foo.bar.find( { "name.first": "Tom" } )
指定返回的字段
> db.db1.tab1.find( {}, { name: "" } )//返回集合中name 集合
> db.db1.tab1.find( {}, { name: "",people:"" } )//集合中不包含people字段也返回
函数
sort({字段名1:1|-1,字段名2:1|-1,...}) //1为升序,-1为降序
limit(<num>)//限制返回数据条数
skip(<num>) //跳过前num条数据,从num+1条数据返回
current() //返回当前游标指向的记录
next() //返回当前游标指向的下一条记录
close() //关闭当前游标,当前游标不再可用
count() //返回当前游标的记录总数
size() //返回当前游标到最终游标的距离
toArray() //以数组形式返回结果集
1.3 更新 update()
1.3.1 特点
同sql中的Update()逻辑类似
1.3.2 具体实例
更新记录字段
> db.db1.tab1.update( { $set: { "name.first": "Mike" } }, { _id: 1 } )
删除记录字段
> db.db1.tab1.update( { $unset: { age: "" } } )
更新数组元素
SequoiaDB使用点操作符(.),数组下标从0开始。下面的操作是修改数组字段 arr 的第二个元素的值,将它的值增加5
> db.foo.bar.update( { $inc: { "arr.1": 5 } } )
1.4 删除 remove()
1.4.1 具体实例
> db.db1.tab1.remove() //删除集合 tab1所有记录
//删除集合 tab1 中所有匹配 name 字段值为“Tom”的记录
> db.db1.tab1.remove( { name: "Tom" } )
//通过索引遍历快速删除匹配条件的记录,“textIndex”为索引名称
> db.foo.bar.remove( { name: "Tom" }, { "": "testIndex" } )
2. 索引
2.1 SequoiaDB索引简介
2.1.1 特点
a. 索引是一种特殊的数据对象,一种条数的元数据,用于提高数据的访问效率
b. 必须建立在集合之上,一个集合最多可拥有64个索引
c. 采用的数据结构为BTree
d. 索引记录从小到大排列在节点上,每个节点的记录值范围由其父节点决定
2.1.2 索引属性
a. name:索引名,在同一个集合中索引名必须唯一
b. key:索引键,为一个JSON对象(key为集合中字段名,值为1[从小到大排序]或-1[从大到小],)。
c. unique:索引是否唯一(可选),默认为false。当为true是,索引指定的字段对应的值唯一
d. enforced:索引是否强制唯一(可选),默认为false,为true时,同时在unique为true时,索引字段最多只能存在一个索引字段为空
2.1.3 具体实例
格式
{ "name": <索引名>, "key": { <索引字段1>: <1|-1>, [ <索引字段2>: <1|-1> ...] },
[ "unique": <true|false> ], [ "enforced": <true|false> ] }
实例
{ "name": "employee_id_key", "key": { "employee_id": 1 } }
{ "name": "record_id_index", "key": { "product_key": 1, "record_key": -1 }, "unique": true }
{ "name": "测试索引", "key": { "测试用例名称": 1 }, "unique": true, "enforced": true }
3. 全文索引
3.1 概述
3.1.1 全文索引的实现
全文索引于前面说到的索引又较大差异。全文索引的索引数据量较大,所有SequoiaDB通过与Elasticsearch配置实现全文检索能力,进而提供全文索引。
3.1.2 全文索引的查询原理
全文索引的索引数据是存储在Elasticsearch中,在使用全文索引查找数据时,会先将请求发给Elasticsearch去进行搜索,将数据返回给数据节点,然后数据节点才回到本地去查找数据
3.1.3 使用全文索引条件
若要使用全文索引功能需要满足三个条件
a. 需要SequoiaDB数据节点
b. 搭建Elasticsearch集群环境
存储全文索引的索引数据,以及对索引的搜索。
每个数据组上的一个全文索引对应Elasticsearch上的一个索引
c. 适配器sdbadapter
这个用于SequoiaDB数据节点与Elasticsearch交互的桥梁,进行数据转换与传输
4. 事务
4.1 事务简介
事务是多个操作集合,其操作只能是:插入数据、修改数据、删除数据
事务默认是开启的,若要关闭使用 updateConf() 命令在 sdb shell 中修改集群的事务配置项。若修改的配置项要求重启节点才能生效,用户需重启相应的节点
关闭所有节点的事务
db.updateConf( { transactionon: false }, { Global: true } )
重启集群
/opt/sequoiadb/bin/sdbstop -t all
/opt/sequoiadb/bin/sdbstart -t all
在开启事务的情况下:节点配置项logfilenum(默认为20)的值不能小于5
4.2 隔离级别
主要有以下三种:默认为0
a. RU=0
b. RC=1
c. RS=2
4.3 事务控制
关于事务的控制主要分为以下三种
a. 开启事务 db.transBegin()
b. 事务提交 db.transCommit()
c. 事务回滚 db.transRollback()
关于写事务操作若发生错误,通过transautorollback配置项可以决定当前会话所有未提交的写操作是否自动回滚(默认为true回滚)