学习Lowdb小型本地JSON数据库

Lowdb是轻量化的基于Node的JSON文件数据库。对于构建不依赖服务器的小型项目,使用LowDB存储和管理数据是很是不错的选择。html

一:lowdb 使用及安装node

在项目中的根目录安装 lowdb 命令以下:git

npm install --save-dev lowdb

lowdb是基于lodash构建的,所以咱们可使用任何 lodash 强大的函数。而且咱们能够串联使用。
下面咱们的目录结构好比是以下:github

|--- lowdb
| |--- node_modules
| |--- app.js
| |--- package.json

而后咱们在app.js 添加以下代码:数据库

const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');

const adapter = new FileSync('./db.json');
const db = low(adapter);

db.defaults({posts: [], user: {}, count: 0 }).write();

如上保存后,咱们在命令行中执行 node app.js 后,会在咱们的项目中的根目录下新建一个叫 db.json 文件,该文件代码变成以下所示:npm

{
  "posts": [],
  "user": {},
  "count": 0
}

如上代码,引入 lowdb包,而后引入 lowdb 中的适配器 FileSync。
lowdb自带的适配器有:FileSync、FileAsync 和 LocalBrowser。分别有如下可选参数:json

defaultValue: 文件不存在时的默认值。
serialize/deserialize: 文件被写以前和读以后的操做。数组

好比以下代码:服务器

const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');

const adapter = new FileSync('./db.json', {
  serialize: (data) => JSON.stringify(data),
  deserialize: (data) => JSON.parse(data)
});
const db = low(adapter);

db.defaults({posts: [], user: {}, count: 0 }).write();

如上代码,若是咱们的db.json 没有数据的时候 才会从新调用 db.defaults初始化数据,不然的话会使用本地存储的数据。咱们能够更改 count 的值试试看,无论咱们在node命令行中运行多少次,值都是同样的,可是当咱们把 db.json内容删除掉后,咱们再运行下,发现最新的内容被写入进去了。app

如上代码,若是咱们把上面的代码改为这样的以下:

const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');

const adapter = new FileSync('./db.json', {
  serialize: (data) => console.log(data),
  deserialize: (data) => console.log(data)
});
const db = low(adapter);

db.defaults({posts: [], user: {}, count: 30 }).write();

那么在命令行中运行下,第一次被写入以前 serialize 打印 为 {} 空对象。而后就执行 db.defaults 操做就会把对应的数据写入到 db.json 文件中,而后咱们就会执行 deserialize 操做对文件进行读取,而后在命令行中会打印 { posts: [], user: {}, count: 30 }。 打印完成后,咱们没有作任何操做后,最后咱们再来查看下 db.json文件的内容变成了 undefined. 所以咱们能够断定 serialize 和 deserialize 这两个操做完成后,他们也会对文件进行写入操做。若是没有值被写入或操做的话,那么文件内容就变为undefined。当文件变为undefined后,咱们再执行上面的代码,能够看到 db.defaults({posts: [], user: {}, count: 30 }).write(); 这句代码是不会被写入的。那么咱们能够猜测的到,这句代码的含义是会判断该文件 有没有内容,若是没有内容的话文件数据才会被写入,不然的话就不会执行任何操做。咱们能够再把 db.json 文件内容所有删除掉,咱们再运行下 node app.js 命令后,能够看到这个时候 数据才会被写入进去。

1. 设置数据

咱们能够对 db.json 数据里面设置某个字段的数据,好比以下代码:

const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');

const adapter = new FileSync('./db.json', {
  serialize: (data) => JSON.stringify(data),
  deserialize: (data) => JSON.parse(data)
});
const db = low(adapter);

db.defaults({posts: [], user: {}, count: 30 }).write();

// 设置数据 
db.set("user.name", 'kongzhi').write();

而后咱们的 db.json 数据变成以下了:

{"posts":[],"user":{"name":"kongzhi"},"count":30}

2. 获取数据

咱们能够对json文件获取某个字段后的值,而后进行添加数据操做,或者删除数据操做,总之咱们能够操做数据,以下代码:

const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');

const adapter = new FileSync('./db.json', {
  serialize: (data) => JSON.stringify(data),
  deserialize: (data) => JSON.parse(data)
});
const db = low(adapter);

db.defaults({posts: [], user: {}, count: 30 }).write();

// 设置数据 
db.set("user.name", 'kongzhi').write();

// get 数据, 而后添加一条数据进去,最后写入文档里面去。
db.get('posts').push({'id': 1, 'title': 'welcome to hangzhou' }).write();

咱们的db.json 文件代码变成以下所示:

{"posts":[{"id":1,"title":"welcome to hangzhou"}],"user":{"name":"kongzhi"},"count":30}

3. 更新数据,咱们能够对某条数据进行更新。以下代码所示:

const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');

const adapter = new FileSync('./db.json', {
  serialize: (data) => JSON.stringify(data),
  deserialize: (data) => JSON.parse(data)
});
const db = low(adapter);

db.defaults({posts: [], user: {}, count: 30 }).write();

// 设置数据 
db.set("user.name", 'kongzhi').write();

// get 数据, 而后添加一条数据进去,最后写入文档里面去。
// db.get('posts').push({'id': 1, 'title': 'welcome to hangzhou' }).write();

// 使用 update 更新数据 这里的n 就是 count 的默认值,在db.json中的count默认值为30, 最后写入进去
db.update('count', n => n + 1).write();

运行后 db.json 数据代码以下所示:

{"posts":[{"id":1,"title":"welcome to hangzhou"}],"user":{"name":"kongzhi"},"count":31}

注意:因为咱们的 lowdb 基于 lodash 的,所以咱们可使用 lodash 中的全部方法和属性。

4. find 查找字段中数据

咱们能够对 db.json 中的某个字段的数据进行查找。代码以下所示:

const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');

const adapter = new FileSync('./db.json', {
  serialize: (data) => JSON.stringify(data),
  deserialize: (data) => JSON.parse(data)
});
const db = low(adapter);

db.defaults({posts: [], user: {}, count: 30 }).write();

// 设置数据 
db.set("user.name", 'kongzhi').write();

// get 数据, 而后添加一条数据进去,最后写入文档里面去。
// db.get('posts').push({'id': 1, 'title': 'welcome to hangzhou' }).write();

// 使用 update 更新数据 这里的n 就是 count 的默认值,在db.json中的count默认值为30, 最后写入进去
db.update('count', n => n + 1).write();

// 查找数据
const value = db.get('posts').find({'id': 1}).value();
console.log(value);

假如咱们的db.json 代码以下:

{"posts":[{"id":1,"title":"welcome to hangzhou"}],"user":{"name":"kongzhi"},"count":33}

所以咱们经过 db.get('posts').find({'id': 1}).value() 后就能够获取到值了,以下所示:

5. lowdb 的API

1. low(adapter): 它返回一个具备特定属性和功能的 lodash.
2. db.[...].write()/.value(): write() 方法是写入数据,value()方法是读取数据。
3. db.getState()/.setState(): 获取/设置数据库的状态。
4. db._ 数据库的lodash的实列。咱们可使用这个来添加咱们本身的函数或者第三方的mixins。好比 lodash-id(https://github.com/typicode/lodash-id)

mixins 的使用列子以下:

代码以下:

const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');

const adapter = new FileSync('./db.json', {
  serialize: (data) => JSON.stringify(data),
  deserialize: (data) => JSON.parse(data)
});
const db = low(adapter);

db.defaults({posts: [], user: {}, count: 30 }).write();

// 使用 mixin 混合模式来扩展咱们本身的方法
db._.mixin({
  getSecondData: function(arr) {
    return arr[1];
  }
});
// 调用 getSecondData 方法 获取到 posts 第二条数据
const xx = db.get('posts').getSecondData().value();
console.log(xx);

假如咱们的db.json 代码以下数据:

{
  "posts":[
    {"id":1,"title":"welcome to hangzhou"},
    {"id":2,"title":"welcome to hangzhou"}
  ],
  "user":{"name":"kongzhi"},
  "count":33
}

咱们运行 node app.js 命令后,能够看到,咱们能够获取到数组里面的第二条数据了,以下所示:

6. db.getState/db.setState 获取数据库状态/设置数据库的状态, 以下代码演示:

const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');

const adapter = new FileSync('./db.json', {
  serialize: (data) => JSON.stringify(data),
  deserialize: (data) => JSON.parse(data)
});
const db = low(adapter);

db.defaults({posts: [], user: {}, count: 30 }).write();

// 获取数据库的状态
console.log(db.getState());

const newState = {}
db.setState(newState);

console.log('-----------');
console.log(db.getState());

db.json 假如数据以下:

{
  "posts":
    [
      {"id":1,"title":"welcome to hangzhou"},
      {"id":2,"title":"welcome to hangzhou"}
    ],
  "user":{"name":"kongzhi"},
  "count":33
}

运行结果以下图所示:

7. 其余json数据操做

好比 db.json 数据以下所示:

{
  "posts":
    [
      {"id":1,"title":"welcome to hangzhou"},
      {"id":2,"title":"welcome to hangzhou"}
    ],
  "user":{"name":"kongzhi"},
  "count":33
}

1. 检查db.json中有没有 'posts' 这个字段是否存在。以下测试代码:

db.has('posts').value();  // 若是有该字段就会返回 true, 不然的话,返回false.

2. 设置值 set 

db.set('posts', []).write(); // 运行完成后,就会对 posts 字段设置为 空数组了 [];

3. 获取特定字段的值 

db.get('posts').map('id').value(); // 执行完成后会返回 [1, 2]

4. 获取数量 

db.get('posts').size().value(); // 返回该数组的长度为 2

5. 获取特定信息的值

db.get('posts[0].id').value(); // 就会返回 1. 

6. 更新信息

db.get('posts')
  .find({title: 'welcome to hangzhou'})
  .assign({name: 'kongzhi'})
  .write();

如上代码,咱们能够看到,咱们获取 posts这个字段,而后经过 find这个关键字去查找 {title: 'welcome to hangzhou'} 这样的,若是找到,就把 它改为 assign 里面的对象值。若是没有找到,就会在该对象里面添加该值,所以上面的结果返回以下:

{
  "posts":[
    {"id":1,"title":"welcome to hangzhou","name":"kongzhi"},
    {"id":2,"title":"welcome to hangzhou"}
  ],
  "user":{"name":"kongzhi"},
  "count":33
}

若是咱们把上面的语句改为以下语句,就会更改对应的值了:

db.get('posts')
  .find({name: 'kongzhi'})
  .assign({name: 'xxx'})
  .write();

那么结果就变成以下:

{
  "posts":[
    {"id":1,"title":"welcome to hangzhou","name":"xxx"},
    {"id":2,"title":"welcome to hangzhou"}
  ],
  "user":{"name":"kongzhi"},
  "count":33
}

7. 删除信息

db.get('posts')
  .remove({name: 'xxx'})
  .write();

那么结果就变为以下了:

{
  "posts":[
    {"id":2,"title":"welcome to hangzhou"}
  ],
  "user":{"name":"kongzhi"},
  "count":33
}

8. 移除属性

db.unset('posts[0].id').write();

那么结果变为以下了:

{"posts":[
    {"title":"welcome to hangzhou"}
  ],
  "user":{"name":"kongzhi"},
  "count":33
}

9. 深拷贝

var xx = db.get('posts').cloneDeep().value();
console.log(xx); // 打印:[ { title: 'welcome to hangzhou' } ]

了解更多相关的知识,请看这里

相关文章
相关标签/搜索