Skip to content

为json提供检索,修改,存储等功能,一个简易的以json为数据格式的内存型db

Notifications You must be signed in to change notification settings

442575816/JsonDB

Folders and files

NameName
Last commit message
Last commit date

Latest commit

1aec4db · Mar 19, 2025

History

14 Commits
Feb 15, 2024
Mar 19, 2025
Jan 6, 2022
Feb 15, 2024
Feb 15, 2024
Feb 15, 2024
Feb 15, 2024
Mar 19, 2025
Jan 5, 2022
Aug 3, 2024
Jan 6, 2022

Repository files navigation

JsonDB

Json是我们最常用的数据类型,本库旨在提供内存级把Json当做数据库使用

一、入门

创建一个Table

var table = JSONTable.Create("students");
table.Insert(@"{""name"":""张三"", ""sex"":""male"", ""age"":1, ""birthday"":""2021-12-14""}");

内部的Json为

{
    "students": [
        {"name":"张三", "sex":"male", "age":1, "birthday":"2021-12-14", "_id":"67f49ca6-35f9-4016-9f02-7857ee24d554"}
    ]
}

检索数据

// LINQ
var data = table.Where(JSON.Eq("name", "张三"));

// JsonPath
var data = table.Table().Get<JsonNode>("$1");
var nameData = table.Table().Get<string>("$1.name");

修改数据

// 更新节点值
var data = table.Where(JSON.Eq("name", "张三"));
data.Set<string>("name", "李四");

// 删除节点
data.Remove("name");

// 新增节点
data.Add("name", "张三");

// 新增对象节点
data.AddJson("address", @"{""city"":""shanghai"", ""street"":""黄浦区北京路99号"", ""roomNo"":""531""}");

通过以上一些列操作,最终输出结果为:

{
    "students": [
        {"_id":"31c46d61-f414-4266-8ae7-1fe2588588a6","address":{"city":"shanghai","roomNo":"531","street":"黄浦区北京路99号"},"age":1,"birthday":"2021-12-14","name":"张三","sex":"male"}
    ]
}

详情见Sample1

二、高级特性

  1. LINQ支持,提供大量的LINQ函数,帮助快速检索数据
public void Run()
{
    var table = JSONTable.Create("students");
    var random = new Random();
    for (var i = 0; i < 1000; i++)
    {
        var male = random.NextDouble() < 0.5 ? "male" : "female";
        var age = random.Next(21) + 10;
        var data = table.Insert($@"{{""name"":""张三{i}"", ""sex"":""{male}"", ""age"":{age}, ""birthday"":""2021-12-14""}}");
        if (male == "male")
        {
            var roomNum = random.Next(1000) + 100;
            data.AddJson("address", $@"{{""city"":""shanghai"", ""street"":""黄浦区北京路99号"", ""roomNo"":""{roomNum}""}}");
        }
    }
    
    // 查找名字叫 张三2的
    var node = table.Where(JSON.Eq("name", "张三2")).FirstOrDefault();
    Console.WriteLine(node);
    
    // 查找地址不为空的
    var nodeList = table.Where(JSON.NotNull("address")).ToList();
    
    // 查找地址不为空的女性
    nodeList = table.Where(JSON.And(JSON.NotNull("address"), JSON.Eq("sex", "female"))).ToList();
    Console.WriteLine($"Count:{nodeList.Count}");
    
    // 查找年龄大于等于15岁的
    nodeList = table.Where(JSON.Gte("age", 15)).ToList();
    Console.WriteLine($"Count:{nodeList.Count}, First:{nodeList[0]}");
    
}

目前支持了一下LINQ函数:

函数名 说明
Eq =
Ne !=
Lt <
Lte <=
Gt >
Gte >=
And and操作符
Or or操作符
NotNull 判断不为空
Null 判断为空
Like 模糊查询
In 包含查询
Len 数量查询
  1. 索引支持

目前可以对JsonTable增加索引,索引实现基于B+Tree

  1. 快照支持和恢复

支持将JsonTable持久化和从快照文件中恢复

三、待完善部分

  • 索引支持范围查找
  • 性能更好的序列化和反序列化
  • 异步序列化的支持
  • 并发的支持

About

为json提供检索,修改,存储等功能,一个简易的以json为数据格式的内存型db

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published