LokiJS 示例代码解析:深入理解内存数据库的核心操作
LokiJS javascript embeddable / in-memory database 项目地址: https://gitcode.com/gh_mirrors/lo/LokiJS
LokiJS 是一个轻量级的 JavaScript 内存数据库,特别适合需要在浏览器或 Node.js 环境中处理数据的应用场景。本文将通过分析示例代码,全面讲解 LokiJS 的核心功能和操作方法。
初始化数据库与集合
首先我们需要创建一个 LokiJS 数据库实例:
var db = new loki('Example');
然后添加两个集合(Collection):
users
集合:包含用户数据,以email
字段作为唯一索引projects
集合:包含项目数据,以name
字段作为索引
var users = db.addCollection('users', ['email'], true, false);
var projects = db.addCollection('projects', ['name']);
数据操作基础
插入数据
使用 insert()
方法向集合中添加文档:
var odin = users.insert({
name: 'odin',
email: 'odin.soap@lokijs.org',
age: 38
});
更新数据
修改文档属性后,需要调用 update()
方法同步索引:
stan.name = 'Stan Laurel';
users.update(stan);
删除数据
使用 remove()
方法删除文档:
users.remove(achilles);
查询操作详解
基本查询
LokiJS 提供了多种查询方式:
// 查找所有文档
users.find()
// 条件查询:年龄等于25的用户
users.find({'age': 25})
// 范围查询:年龄大于25的用户
users.find({'age': {'$gt': 25}})
// 正则查询:名字包含"in"的用户
users.find({name: {'$regex': /in/}})
数组查询
对于包含数组的字段,可以使用 $contains
和 $containsAny
操作符:
// 查找包含所有指定标签的项目
projects.find({'tags': {'$contains': ['critical', 'public']}})
// 查找包含任一指定标签的项目
projects.find({'tags': {'$containsAny': ['critical', 'top secret']}})
高级查询功能
动态视图(DynamicView)
动态视图是 LokiJS 的强大特性,可以创建实时更新的数据视图:
// 创建动态视图
var dynView = users.addDynamicView("over30users");
// 应用过滤条件
dynView.applyFind({'age': {'$gt': 30}});
// 应用排序
dynView.applySimpleSort("age", true); // 降序排列
// 获取结果
dynView.data()
动态视图会自动响应数据变化,保持视图的最新状态。
结果集链式操作
LokiJS 支持链式调用,可以组合多个操作:
users.chain()
.find({'age': {'$gt': 25}})
.where(function(obj) { return obj.name.indexOf("in") != -1 })
.simplesort("age")
.data()
持久化动态视图
可以创建持久化的动态视图,提高查询性能:
var dynViewPersistent = users.addDynamicView("over20users", {persistent: true});
数据处理功能
Map-Reduce
LokiJS 支持 Map-Reduce 操作,适合数据聚合:
function mapFun(obj) { return obj.age; }
function reduceFun(array) {
var len = array.length >>> 0;
var i = len;
var cumulator = 0;
while (i--) { cumulator += array[i]; }
return cumulator / len;
}
users.mapReduce(mapFun, reduceFun); // 计算平均年龄
批量更新
使用 findAndUpdate()
方法可以批量更新文档:
function updateAge(obj) {
obj.age *= 2;
return obj;
}
users.findAndUpdate(ageView, updateAge);
数据序列化与恢复
LokiJS 可以轻松序列化和恢复数据:
// 序列化为JSON
var json = db.serialize();
// 从JSON恢复
db.loadJSON(json);
最佳实践建议
- 合理使用索引:为频繁查询的字段添加索引提高性能
- 动态视图复用:对于常用查询,创建持久化动态视图
- 链式操作:组合多个操作提高代码可读性
- 批量更新:使用
findAndUpdate
代替循环更新 - 数据变化监控:利用动态视图的自动更新特性
通过这个示例,我们可以看到 LokiJS 提供了丰富的数据操作功能,从基本的 CRUD 到高级的查询和数据处理,非常适合需要在客户端处理复杂数据逻辑的应用场景。
LokiJS javascript embeddable / in-memory database 项目地址: https://gitcode.com/gh_mirrors/lo/LokiJS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考