NeDB
是使用Nodejs
实现的一个NoSQL
嵌入式数据库操作模块,可以充当内存数据库,也可以用来实现本地存储,甚至可以在浏览器中使用。查询方式比较灵活,支持使用正则、比较运算符、逻辑运算符、索引以及JSON
深度查询等。
NeDB
嵌入到了应用程序进程中,消除了与客户机服务器配置相关的开销,在运行时,也只需要较少的内存开销,使用精简代码编写,速度更快。其API
是MongoDB
的一个子集,可以通过这些接口轻松管理应用程序数据,而不依靠原始的文档文件。
具有简单、轻量、速度快等特点,由于嵌入式数据库存储总数据量最好要控制在1GB以内,所以适合在不需要大量数据处理的应用系统中使用(比如使用nw.js
等实现的桌面应用程序、并发量不大的系统等)。
一、安装NeDB
数据库
cnpm install nedb --save
二、建立数据库链接
import NeDB from 'nedb';
const DB = new NeDB({
autoload: true,
filename: ('path/to/datafile/data.db')
})
三、操作数据库
- 新增数据
语法:
db.insert(doc, callback)
作用:
插入文档数据(文档相当于mysql
表中的一条记录)。如果文档不包含_id
字段,NeDB
会自动生成一个,该字段是16个字符长度的数字字符串。该字段一旦确定,就不能被更改。
参数:
doc
: 支持String
,Number
,Boolean
,Date
,null
,array
以及object
类型。如果该字段是undefined
类型,将不会被保存,这里和MongoDB
处理方式有点不同,MongoDB
会将undefined
转换为null
进行存储。字段名称不能以"$
"开始,也不能包含".
"。
callback
(可选): 回调函数,包含参数err
以及newDoc
,err
是报错,newDoc
是新插入的文档,包含它的_id
字段。
示例如下:
DB.insert({ name: 'cuiht', age: 25 }, function (err, doc) {
if (err) {
console.log(err);
return;
}
console.log(doc);
});
- 查询数据
语法:
db.find(query, callback)
ordb.findOne(query, callback)
作用:
db.find(query, callback)
查询符合条件的文档集,db.findOne(query, callback)
查询符合条件的一个文档
参数:
query
:object
类型,查询条件。支持使用比较运算符($lt
,$lte
,$gt
,$gte
,$in
,$nin
,$ne
), 逻辑运算符($or
,$and
,$not
,$where
), 正则表达式进行查询。
callback
(可选): 回调函数,包含参数err
以及docs
,err
是报错,docs
是查询到的文档集。
示例如下:
DB.find({ age: 20}, (err, docs) => {
if (err) {
console.log(err);
return;
}
console.log(docs);
});
DB.findOne({ _id: 'rlflxrv0OXkew9z4' }, (err, docs) => {
if (err) {
console.log(err);
return;
}
console.log(docs);
});
- 更新数据
语法:
db.update(query, update, options, callback)
作用:
根据update
参数的规则,更新匹配到query
的结果集。
参数:
query
: 与find
和findOne
中query
参数的用法一致
update
: 指定文档更改规则。该参数可以是一个新的文档,也可以是一套修饰符,两者不能同时使用。使用修饰符时,如果需要更改的字段不存在,将会自动创建。可用的修饰符有$set
(改变字段值),$unset
(删除某一字段),$inc
(增加某一字段),$min/$max
(改变字段值,传入值需要小于/大于当前值), 还有一些用在数组上的修饰符,$push
,$pop
,$addTopSet
,$pull
,$each
,$slice
,具体用法如下示例。
options
:object
类型。muti
(默认false
),是否允许修改多条文档;upsert
(默认为false
),如果query
没有匹配到结果集,有两种情况需要考虑,一个是update
是一个简单的对象(不包含任何修饰符),另一种情况是带有修饰符,对第一种情况会直接将该文档插入,对第二种情况会将通过修饰符更改后的文档插入;
callback
(可选): 参数(err
,numAffected
,affectedDocuments
,upsert
)。numAffected
:被影响的文档个数;affectedDocuments
:更新后的文档。
注意:_id不能被修改
示例如下:
DB.update({ _id: 'rlflxrv0OXkew9z4' }, { $set: { name: 'cuiht_update' } }, function (err, data) {
if (err) {
console.log(err);
return;
}
console.log(data);
});
- 删除数据
语法:
db.remove(query, options, callback)
作用:
根据options
配置删除所有query
匹配到的文档集。
参数:
query
: 与find
中query
参数的用法一致
options
: 只有一个可用。muti
(默认false
),允许删除多个文档。
callback
: 可选,参数:err
,numRemoved
示例如下:
DB.remove({ _id: 'rlflxrv0OXkew9z4' }, {}, function (err, data) {
if (err) {
console.log(err);
return;
}
console.log(data);
});
四、使用案例
注意,这里是在vue
中的使用案例。
- 新建文件
src/DB/index.js
。
/*
* @Author: cuiht
* @Date: 2022-04-22 13:38:40
* @LastEditors: cuiht
* @LastEditTime: 2022-04-22 16:40:46
* @Description: 数据库链接 及 数据库操作方法封装
*/
import NeDB from 'nedb';
const DBList = {
history: new NeDB({
autoload: true,
// 指定数据库文件路径
filename: ('path/to/datafile/data.db')
})
}, DBserve = (arg) => {
return new Promise((resolve, reject) => {
const { DBname = '', order = '', option = {} } = arg;
if (!DBname) {
return reject({
code: 0,
msg: '未获取数据库名!'
})
}
const _DB = DBList[DBname];
if (!order) {
return reject({
code: 0,
msg: '未获取到指令!'
})
}
switch (order) {
case 'insert':
_DB.insert({
...option,
createTime: new Date
}, function (err, data) {
if (err) {
return reject({
code: 0,
msg: err
})
}
return resolve({
code: 200,
msg: "新增成功!",
data,
})
});
break;
case 'find':
_DB.find(option).sort({ createTime: -1 }).exec(function (err, data) {
if (err) {
return reject({
code: 0,
msg: err
})
}
return resolve({
code: 200,
msg: "查询列表成功!",
data,
})
});
break;
case 'findOne':
_DB.findOne(option, function (err, data) {
if (err) {
return reject({
code: 0,
msg: err
})
}
return resolve({
code: 200,
msg: "查询成功!",
data,
})
});
break;
case 'update':
if (!option?._id) {
return reject({
code: 0,
msg: '未获取到id'
})
}
_DB.update({ _id: option._id }, { $set: option }, function (err, data) {
if (err) {
return reject({
code: 0,
msg: err
})
}
return resolve({
code: 200,
msg: "更新成功!",
data,
})
});
break;
case 'remove':
if (!option?._id) {
return reject({
code: 0,
msg: '未获取到id'
})
}
_DB.remove({ _id: option._id }, {}, function (err, data) {
if (err) {
return reject({
code: 0,
msg: err
})
}
return resolve({
code: 200,
msg: "删除成功!",
data,
})
});
break;
default:
break;
}
})
}
export default DBserve;
- 新建
src/network/historyServes.js
。
*
* @Author: cuiht
* @Date: 2022-04-22 13:37:11
* @LastEditors: cuiht
* @LastEditTime: 2022-04-22 16:42:41
* @Description: 调用数据库方法封装
*/
import DBserve from '@/db'
export const
// 新增记录
historyAdd = data => DBserve({
DBname: 'history',
order: 'insert',
option: data
}),
// 查询记录列表
historyList = data => DBserve({
DBname: 'history',
order: 'find',
option: data
}),
// 查询记录
historyGet = data => DBserve({
DBname: 'history',
order: 'findOne',
option: data
}),
// 修改记录
historyUpt = data => DBserve({
DBname: 'history',
order: 'update',
option: data
}),
// 删除记录
historyDel = data => DBserve({
DBname: 'history',
order: 'remove',
option: data
});
- 新建一个
vue
页面。
<!--
* @Author: cuiht
* @Date: 2022-04-21 15:38:03
* @LastEditors: cuiht
* @LastEditTime: 2022-04-22 16:43:27
* @Description: 使用示例
-->
<template>
<div id="text-page">
<table class="list">
<tr>
<td><button @click="Add">新增</button></td>
</tr>
<tr v-for="item in list" :key="item._id">
<td>
{{ item }}
</td>
<td style="width: 150px">
<button @click="Upt(item)">修改</button>
<button @click="Del(item)">删除</button>
<button @click="Get(item)">查看</button>
</td>
</tr>
</table>
</div>
</template>
<script>
import {
historyAdd,
historyList,
historyGet,
historyUpt,
historyDel,
} from "@/network/historyServes";
export default {
name: "test",
data() {
return {
list: [],
};
},
mounted() {
this.List();
},
methods: {
Add() {
const reqData = {
age: this.list.length + 1,
name: "cuiht-" + new Date().getTime(),
};
historyAdd(reqData).then((res) => {
console.log(res);
if (res.code !== 200) {
return;
}
this.List();
});
},
List() {
historyList().then((res) => {
console.log(res);
if (res.code !== 200) {
return;
}
this.list = res.data;
});
},
Get(item) {
historyGet({
_id: item._id,
}).then((res) => {
console.log(res);
if (res.code !== 200) {
return;
}
alert(JSON.stringify(res.data));
});
},
Upt(item) {
const reqData = {
_id: item._id,
age: this.list.length + 1,
name: "undate-" + new Date().getTime(),
};
historyUpt(reqData).then((res) => {
console.log(res);
if (res.code !== 200) {
return;
}
this.List();
});
},
Del(item) {
historyDel({
_id: item._id,
}).then((res) => {
console.log(res);
if (res.code !== 200) {
return;
}
this.List();
});
},
},
};
</script>
<style lang="scss">
#text-page {
width: 100vw;
height: 100vh;
position: fixed;
top: 0;
left: 0;
}
</style>
效果图
参考文章:NeDB—Node嵌入式数据库 w3cschool
我们最终都要远行,最终都要跟稚嫩的自己告别。
网友评论