最近再研究一些其他的資料庫做快取用,我在想除了 SQLite 還有啥選擇,這時候我看到 wiki 有寫到一個 nosql 的資料庫叫做 iBoxDB 也支持 C#
就想說研究一下,想說順手筆記一下

首先,你只需要引入一個 library : iBoxDB
順手測試一些東西,寫了一個物件 叫做 User 如下,接下來會建立兩張 Table 分別為 USERS1 , USERS2 然後分成奇數偶數寫入
Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "db1");
var boxDB = new IBoxDB.LocalServer.DB(AppDomain.CurrentDomain.BaseDirectory + "db1");
boxDB.GetConfig().EnsureTable("USERS1", "Id");
boxDB.GetConfig().EnsureTable("USERS2", "Id");
var auto = boxDB.Open();
Console.WriteLine("=============================== INSERT DATA =============================== ");
//Create
for (var j = 1; j <= 10; j++)
{
var user = new User { Id = "DONMA-ID-" + j, Name = "許當麻", Birth = DateTime.Now, Friends = new List(), Salary = (111.11m * j) };
for (var i = 1; i <= 5; i++)
{
user.Friends.Add(new User { Id = "DONMA-FRIEND" + i, Name = "許當麻朋友" + i, Birth = DateTime.Now.AddYears(-i), Friends = new List(), Salary = i * 100 });
}
var resCreate = false;
if (j % 2 != 0)
{
resCreate = auto.Insert("USERS1", user);
}
else
{
resCreate = auto.Insert("USERS2", user);
}
Console.WriteLine("Create Result " + j + ":" + resCreate);
}
//Result:
//Create Result 1:True
//Create Result 2:True
//Create Result 3:True
//Create Result 4:True
//Create Result 5:True
//Create Result 6:True
//Create Result 7:True
//Create Result 8:True
//Create Result 9:True
//Create Result 10:True
1. 寫入篇 ,這時候我指定程式執行的跟目錄 db1 當作資料放置位置,之後就是寫入的部分,寫入十筆並且我在 Friends 都有放入一些 User物件們做測試
Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "db1");
var boxDB = new IBoxDB.LocalServer.DB(AppDomain.CurrentDomain.BaseDirectory + "db1");
boxDB.GetConfig().EnsureTable("USERS1", "Id");
boxDB.GetConfig().EnsureTable("USERS2", "Id");
var auto = boxDB.Open();
Console.WriteLine("=============================== INSERT DATA =============================== ");
//Create
for (var j = 1; j <= 10; j++)
{
var user = new User { Id = "DONMA-ID-" + j, Name = "許當麻", Birth = DateTime.Now, Friends = new List(), Salary = (111.11m * j) };
for (var i = 1; i <= 5; i++)
{
user.Friends.Add(new User { Id = "DONMA-FRIEND" + i, Name = "許當麻朋友" + i, Birth = DateTime.Now.AddYears(-i), Friends = new List(), Salary = i * 100 });
}
var resCreate = false;
if (j % 2 != 0)
{
resCreate = auto.Insert("USERS1", user);
}
else
{
resCreate = auto.Insert("USERS2", user);
}
Console.WriteLine("Create Result " + j + ":" + resCreate);
}
//Result:
//Create Result 1:True
//Create Result 2:True
//Create Result 3:True
//Create Result 4:True
//Create Result 5:True
//Create Result 6:True
//Create Result 7:True
//Create Result 8:True
//Create Result 9:True
//Create Result 10:True
2.取出所有的 TABLES
Console.WriteLine("=============================== GET ALL TABLES =============================== ");
//Get All Tables
var res = boxDB.Open().GetDatabase().GetSchemata();
foreach (var t in res)
{
if (!t.Key.Contains("__"))
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(t.Key + ":" + t.Value);
Console.ResetColor();
}
else
{
Console.WriteLine(t.Key + ":" + t.Value);
}
}
Result:

3.透過 Key 查找資料
var resGetData = auto.Get("USERS2", "DONMA-ID-2");
Console.WriteLine(JsonConvert.SerializeObject(resGetData));
//=============================== 取得資料by KEY ===============================
//{"Id":"DONMA-ID-2","Name":"許當麻","Birth":"2022-11-15T12:20:31.3568287+08:00","Salary":222.22,"Friends":null}
4.查詢範圍的資料 Salary >=400 && Salary <=700
Console.WriteLine("=============================== 搜尋範圍資料 =============================== ");
var resDataRange = auto.Select("from USERS2 where Salary >=? && Salary<=?", 400m, 700m);
foreach (var user in resDataRange)
{
Console.WriteLine(JsonConvert.SerializeObject(user));
}
//=============================== 搜尋範圍資料 ===============================
//{"Birth":"2022-11-15T12:20:31.366535+08:00","Id":"DONMA-ID-6","Name":"許當麻","Salary":666.66}
//{"Birth":"2022-11-15T12:20:31.360662+08:00","Id":"DONMA-ID-4","Name":"許當麻","Salary":444.44}
5.取得 USER2 Table 中所有資料
Console.WriteLine("=============================== GET ALL TABLES =============================== ");
var res = boxDB.Open().GetDatabase().GetSchemata();
foreach (var t in res)
{
if (!t.Key.Contains("__"))
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(t.Key + ":" + t.Value);
Console.ResetColor();
}
else
{
Console.WriteLine(t.Key + ":" + t.Value);
}
}
/*
=============================== 取得所有資料 ===============================
{"Birth":"2022-11-15T12:20:31.3672558+08:00","Id":"DONMA-ID-8","Name":"許當麻","Salary":888.88}
{"Birth":"2022-11-15T12:20:31.366535+08:00","Id":"DONMA-ID-6","Name":"許當麻","Salary":666.66}
{"Birth":"2022-11-15T12:20:31.360662+08:00","Id":"DONMA-ID-4","Name":"許當麻","Salary":444.44}
{"Birth":"2022-11-15T12:20:31.3568287+08:00","Id":"DONMA-ID-2","Name":"許當麻","Salary":222.22}
{"Birth":"2022-11-15T12:20:31.3706268+08:00","Id":"DONMA-ID-10","Name":"許當麻","Salary":1111.10}
*/
6.透過 LINQ 查詢 Id 包含某關鍵字資料
Console.WriteLine("=============================== 找尋關鍵字 =============================== ");
var resContainData = from o in auto.Cube().Select("from USERS2")
where o.Id.Contains("D-4")
select o;
foreach (var user in resContainData)
{
Console.WriteLine(JsonConvert.SerializeObject(user));
}
//=============================== 找尋關鍵字 ===============================
//{"Id":"DONMA-ID-4","Name":"許當麻","Birth":"2022-11-15T12:20:31.360662+08:00","Salary":444.44,"Friends":null}
這裡面比較詭異的就是我放得 Friends 都是 null 不過這樣設計本來就不是很好建議應該是 mapping 才對
先主要分享到這裡,如果有其他發現的我在繼續寫下去..
參考文獻:
https://www.bookstack.cn/read/iBoxDB/143003
https://blog.51cto.com/u_15162069/2760340
https://www.cxyzjd.com/article/lile1234_show/78771292
https://github.com/iboxdb/iboxdb.github.io
https://iboxdb.github.io/