JsonDB
期待大家多多支持
Json是我們最常用的數(shù)據(jù)類型赔退,本庫旨在提供內(nèi)存級把Json當(dāng)做數(shù)據(jù)庫使用
一主卫、入門
創(chuàng)建一個Table
var table = JSONTable.Create("students");
table.Insert(@"{""name"":""張三"", ""sex"":""male"", ""age"":1, ""birthday"":""2021-12-14""}");
內(nèi)部的Json為
{
"students": [
{"name":"張三", "sex":"male", "age":1, "birthday":"2021-12-14", "_id":"67f49ca6-35f9-4016-9f02-7857ee24d554"}
]
}
檢索數(shù)據(jù)
// LINQ
var data = table.Where(JSON.Eq("name", "張三"));
// JsonPath
var data = table.Table().Get<JsonNode>("$1");
var nameData = table.Table().Get<string>("$1.name");
修改數(shù)據(jù)
// 更新節(jié)點(diǎn)值
var data = table.Where(JSON.Eq("name", "張三"));
data.Set<string>("name", "李四");
// 刪除節(jié)點(diǎn)
data.Remove("name");
// 新增節(jié)點(diǎn)
data.Add("name", "張三");
// 新增對象節(jié)點(diǎn)
data.AddJson("address", @"{""city"":""shanghai"", ""street"":""黃浦區(qū)北京路99號"", ""roomNo"":""531""}");
通過以上一些列操作,最終輸出結(jié)果為:
{
"students": [
{"_id":"31c46d61-f414-4266-8ae7-1fe2588588a6","address":{"city":"shanghai","roomNo":"531","street":"黃浦區(qū)北京路99號"},"age":1,"birthday":"2021-12-14","name":"張三","sex":"male"}
]
}
詳情見Sample1
二谴轮、高級特性
-
LINQ
支持,提供大量的LINQ
函數(shù),幫助快速檢索數(shù)據(jù)
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"":""黃浦區(qū)北京路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函數(shù):
函數(shù)名 | 說明 |
---|---|
Eq | = |
Ne | != |
Le | < |
Lte | <= |
Ge | > |
Gte | >= |
And | and操作符 |
Or | or操作符 |
NotNull | 判斷不為空 |
Null | 判斷為空 |
Like | 模糊查詢 |
In | 包含查詢 |
Len | 數(shù)量查詢 |
-
索引
支持
目前可以對JsonTable增加索引墨闲,索引實(shí)現(xiàn)基于B+Tree
-
快照
支持和恢復(fù)
支持將JsonTable持久化和從快照文件中恢復(fù)
三挑宠、待完善部分
- 索引支持范圍查找
- 性能更好的序列化和反序列化
- 異步序列化的支持
- 并發(fā)的支持