结构化存储工具
*1、低版本升级到1.3.0请执行upgrade和submit更新存储文件。
*2、1.5.0版本请注意page的用法。
*3、1.6.1修改String中文存储的BUG建议更新,更新请注意第1、2条和page的用法。
*4、1.7.0修复中文路径问题。
初始化和更新升级
import upgrade from 'dmb3'
const {appendSet, submit} = upgrade('test', {version: 1, password: '', newPwd: ''})
appendSet(/* */)
submit()
文件结构为:假设存储名为:test
test ┳ 1.2 ┳ buffer ┳
┃ ┃ ┇ // buffer格式或者文本格式的存储目录
┃ ┃ ┗
┃ ┣ data // 数据存储文件
┃ ┣ index // 数据索引文件
┃ ┗ index.mjs // 数据访问文件,可以通过该文件访问指定版本
┣ ...
┣ 3 ┳ ...
┃ ┗ index.mjs // 数据访问文件,可以通过该文件访问指定版本
┣ 4 ...
┗ index.mjs // 默认入口文件,指向最新版本
数据类型
类型:Id, Uint, Int, Bool, Time, Float, String, Buffer, Text
import upgrade, {
Bigint,
bigintSerialize,
BigUint,
Buffer,
Byte,
Float,
Id,
Int,
String,
Text,
Time,
Uint
} from 'dmb3'
const {appendSet, submit} = upgrade('test')
appendSet('user', {
uid: String,
pwd: String('存MD5指').length(32),
loginTime: Time().value(Time.update)
}, '用户表')
submit().then(() => console.log('完成'))
缺省写法与完整写法
// Time.value(Time.update) 和 Time().value(Time.update) 两种写法一样。
/* 例如:
appendSet('test', {
id: Id,
})
等价
appendSet('test', {
id: Id(),
})
*/
// Id 用法
Id('备注') // 会补全默认值
Id()
.index(false) // 是否索引,此类型默认为 true
.value('2') // 默认值,此类型缺省为 1
.step(2) // 缺省自增值,此类型缺省为 1
.remark('备注') // 可缺省
// Uint 用法
Uint()
.index(false) // 是否索引,此类型默认为 false
.value(2) // 默认值,此类型没有缺省值
.step(2) // 缺省自增值,此类型没有缺省值
.remark('备注') // 可缺省
// Int 用法
Int()
.index(false) // 是否索引,此类型默认为 false
.value(2) // 默认值,此类型没有缺省值
.step(2) // 缺省自增值,此类型没有缺省值
.remark('备注') // 可缺省
// Bool 用法
Bool()
.index(false) // 是否索引,此类型默认为 false
.value(false) // 默认值,此类型缺省为 false
.remark('备注') // 可缺省
// Time 用法
Time()
.index(false) // 是否索引,此类型默认为 false
.value(Time.update) // 默认值,此类型没有缺省值,可取值:Time.update、Time.now
.remark('备注') // 可缺省
// Float 用法
Float()
.index(false) // 是否索引,此类型默认为 false
.value(0.1) // 默认值,此类型没有缺省值
.step(0.1) // 缺省自增值,此类型没有缺省值
.remark('备注') // 可缺省
// String 用法
String()
.index(false) // 是否索引,此类型默认为 false
.value('123456') // 默认值,此类型没有缺省值
.length(8) // 长度,此类型默认为 12
.remark('备注') // 可缺省
// Buffer 用法
Buffer().remark('备注') // 可缺省
// Text 用法
Text().remark('备注') // 可缺省
存储结构更新写法
// 新增集合
appendSet('user', {
uid: String,
pwd: String('存MD5指').length(32)
}, '用户表')
// 更新集合备注
updateSetRemark('log', '日志表')
// 更新列
updateCol('user', {
loginTime: Time().value(Time.update).remark('登录时间')
})
// 更名操作
renameSet('test', 'test2')
renameCol('user', {
uid: 'usn',
test: 'test2',
})
// 删除操作
deleteSet('test2')
deleteCol('user', 'test2')
const {submit} = upgrade('test', {
version: 7,
password: '123123',
newPwd: '111111' // 新密码
})
submit()
打开使用已有存储文件
使用
import storage from './test/index.mjs' // 使用最新版本
import storage from './test/7/index.mjs'// 使用指定版本
import storage, {remark, getStruct} from './test/7/index.mjs' // 获取存储结构和集合备注
查:
storage.admin.find(admin => admin.usn.includes('test')).role
if (storage.admin.indexByUid('admin')[0].pwd === '123456');
// 带索引的时间
storage.admin.indexByLoginTime(-Infinity, '2022/01/01')
// 简单分页查询
storage.admin.page(admin => predicate(admin), index, size)
// 结果缓存的分页查询,缓存10秒
const params = {key: 'name', index: 1, size: 10}
storage.admin.page(admin => predicate(admin), 'index', 'size', params)
// 联合查询 eachFlat类似LEFT JOIN,filterFlat类似INNER JOIN
storage.user.eachFlat(storage.userRole, (a, b) => a.userId === b.userId)
.filterFlat(storage.role, 'roleId')
增:
storage.admin.push(
{
usn: 'admin',
pwd: '123456'
},
{
usn: 'test',
pwd: '123456'
}
)
改:
storage.admin.find(admin => admin.usn === 'admin').role = 'root'
删:
storage.admin.remove(...storage.admin.filter(admin => admin.usn.startsWith('test')))
更多使用方法参考 test.mjs
保存:
storage.close()
// 关闭并保存