LT;DR;
博主在使用 lowdb 时遇到了几个需求光靠 lowdb 提供的 API 无法实现。其实 lowdb 是基于 Lodash 的,可以使用 Lodash 提供的 API 实现自己的一些需求。比如下面提到的「数组删除元素」与「深查询」。
基本上查看下面的文档就行了:
PS:至 2019-06-07 日,配合 TypeScript 使用 lowdb 时,如果要使用 Lodash 的 API(当然,直接使用 Lodash 也同理。),即便你安装了 @types/lodash
,仍然有许多方法会报编译错误。这是因为声明还没覆盖完 lodash
的方法。使用时可以忽略这些错误或者设置 //@ ts-ignore
忽略编译报错。
前言
之前说过想做一个用于标记的本地应用,最近感觉想法成型了,于是开始研究怎么做出来。
中间种种过程略去不提,但谈我最后选用 electron 来开发,然后需要用到数据库。没怎么比较,选择了 lowdb 这个基于 json 的小型数据库。
入门教程看的这篇:Electron-vue 开发实战 2——引入基于 Lodash 的 JSON 数据库 lowdb 。
正文
使用过程中有几个需求没找到明确的解决方式。
比如对数组元素的删除。例如有一个数组:
1 | ["快乐", "开心", "悲伤"] |
没有提供直接删除数组元素的方法。
其次,没在官方文档找到 「对象 A 作为 对象 B 的属性时,如何通过查询 对象 A 的属性 获取 对象 B」,即深查询的方法。
有点绕吧,还是举个例子:
1 | { |
没有直接通过查询 轮胎 获取 这整块数据的方式。
对官方提供的几个 api 翻来过去的组合搭配也没能成功。
看到提供了自定义操作的方法,差点准备自己实现了。
1 | db._.mixin({ |
其实这个就是 lodash 提供的接口……
另外 lodash-id 等插件就是通过这个 api 注入进去的。
太沙雕了。
这不是很复杂的操作,不应该这么复杂啊……
翻读了几遍文档,才注意到 lowdb 基于 Lodash 的。
眼前一亮,去翻了一下 Lodash 的 API……
上面提到的第一个问题,删除数组属性,可以通过 Lodash 的 remove 实现。如下:
1 | // 删除 标签 |
而深查询可以这样:
1 | export function getItemByName(name) { |
传一个具有两个元素的数组,就会分别匹配键值。
稍微复杂点的例子
来一个数组与深查询组合拳……
数据如下:
1 | [ |
如何通过 标签名 查询该 标签 下的 所有条目?
可以这样:
1 | // 通过 标签名 获取 条目 |