1

关于标记

之前在上面这篇博文写到想做一个标记的本地应用,最近感觉想法成型了,于是开始研究怎么做出来.

中间种种过程略去不提,但谈我最后选用 electron 来开发,然后需要用到数据库,没怎么比较,选择了 lowdb 这个基于json 的小型数据库.

先贴官方链接.

Githug-lowdb

然后入门教程看的这篇 : Electron-vue开发实战2——引入基于Lodash的JSON数据库lowdb .

2

使用过程中有几个需求没找到明确的解决方式.

比如对数组元素的删除.

例 :

["快乐","开心","悲伤"]

官方文档没找到 “对象A 作为一个 对象B 的属性时,如何通过查询 对象A 的属性 获取 对象B” 的方法.

有点绕吧,还是举个例子 :

{
  name : "车",
  component : {
    "轮胎" : "香港造"
    ...
  }
}

没有直接通过查询 轮胎 获取 这整块数据的方式.

3

对官方提供的几个 api 翻来过去的组合搭配也没能成功.

我太傻雕了.

看到提供了自定义操作的方法,差点准备自己实现了.

db._.mixin({
  second: function(array) {
    return array[1]
  }
})

db.get('posts')
  .second()
  .value()

其实这个就是 lodash 提供的接口…

另外 lodash-id 等插件就是通过这个 api 注入进去的

太沙雕了.

这不是很复杂的操作,不应该这么复杂啊…

仔细翻了一下文档,才注意到 lowdb 是基于 lodash 的,可以使用 lodash 的 api …

眼前一亮,去翻了一下 lodash 的 api …

lodash

果然找到…

4

上面提到的第一个问题,删除数组属性,可以通过 remove 实现.

看看我封装的函数…

// 删除 标签
export function deleteTagByName(tagName) {
    db.read().get('tag')
        .remove(function(n) {
            // console.log(n);
            // console.log(tagName);
            return n === tagName;
          })
        .write();
}

而深查询…

export function getItemByName(name) {
    return db.read().get('item')
        .filter(["template_style.name", name])
        .value();
}

传一个具有两个元素的数组,就会分别匹配键值.

5

再来一个数组与深查询组合拳…

[ {
    id: 7,
    template_name: "单曲",
    template_style: {

        "name": "菊次郎的夏天",
        "作者": "久石让",
        "状态": "听过",
        "标记时间": "2019-02-10"

    },
    tag_name: ["童年"]
}, {
    id: 8,
    template_name: "单曲",
    template_style: {

        "name": "荡起双桨",
        "作者": "佚名",
        "状态": "听过",
        "标记时间": "2019-03-10"

    },
    tag_name: ["童年", "恐怖"]
}]

我想通过标签名查询该标签下的 项.

直接上代码

// 通过 标签名 获取 条目
export function getItemsByTagName(tagName) {
    return db.read().get('item').filter(function (item) {
        if (item.tag_name.indexOf(tagName) !== -1) {
            return true;
        } else {
            return false;
        }
    }).value();
}

灵活组合也能实现许多强大的查询诶…