LiteDB 是一個 Document-Oriented 的資料庫,是屬於 NoSQL 這一邊的,經常被拿來跟 SQL 陣營的 SQLite 比較,不過我個人是覺得這沒什麼好比的,都很好用,但是 LiteDB 不用下 SQL 語法,而且它有支援到 .Net Standard 2.0,意謂著 LiteDB 是可以跨平台的,我們可以在 Windows、Linux、macOS、Android、iOS 上使用它,非常適合在 Local 端拿來儲存資料,甚至於網站在 POC 期間這種使用者人數不多的情況之下,都可以先用 LiteDB 撐著。
連線字串
跟一般的資料庫一樣,我們需要透過連線字串來建立一個 LiteDB 的連線,而 LiteDB 的連線字串選項有很多,我們只要先關注這幾個就行了。
Filename
:它可以是一個檔案的絕對路徑,或是相對於與 LiteDB.dll 相同目錄的檔案路徑。Password
:如果有輸入密碼,LiteDB 就會拿密碼來為我們的資料庫檔案做 AES 加密。Mode
:有 Exclusive、ReadOnly、Shared 三個選項,這邊要注意的是預設值,在 .Net Framework 3.5、4.0、.Net Standard 2.0 預設是 Shared,但是 .Net Standard 1.3 是 Exclusive,而 Exclusive Mode 同時只能有一個 LiteDB Instance 去存取資料庫檔案。Limit Size
:資料庫檔案大小上限,我們可以這樣填 1KB、2MB、3GB。
建立 Collection
Collection
是操作 LiteDB 的基礎,資料的增刪改查都從 Collection 起手,建立 Collection 的方法有三個,我們直接看 Code。
using (var db = new LiteDatabase(connectionString))
{
// 直接用自訂型別當 Collection Name
var collection1 = db.GetCollection<Sample>();
// 額外定義一個 Collection Name
var collection2 = db.GetCollection<Sample>("customer");
// 沒有自訂型別也可以建立 Collection
var collection3 = db.GetCollection("customer");
}
如果建立 Collection 的時候沒有指定一個型別會怎樣? LiteDB 會用 BsonDocument
當成 document 的型別,而這之後我們就只能以 key-value 的形式來存取 document 內的資料。
新增資料
LiteDB 提供有 Insert
及 InsertBulk
方法,新增單筆資料只能用 Insert 方法,而要新增多筆資料則 Insert 及 InsertBulk 方法都可以。
using (var db = new LiteDatabase(connectionString))
{
var collection = db.GetCollection<Sample>();
// 新增單筆資料
collection.Insert(new Sample());
// 新增多筆資料
collection.Insert(new List<Sample>());
collection.InsertBulk(new List<Sample>());
}
可是一樣是新增多筆資料,使用 InsertBulk 差在哪裡? 只有差在節省記憶體而已,以我實際測試寫入 150000 筆資料,每筆資料大概 100 bytes 來說,InsertBulk 反而已還比較慢,不過官方也沒有說 InsertBulk 比較快就是了。
刪除資料
LiteDB 提供 Delete
方法用來刪除資料,給 Delete 方法 id 值就可以刪除單筆資料,給條件就可以依條件刪除資料,給條件的方式有兩種,一種是我們熟悉的 Lambda Expression,一種是 LiteDB 內建 Query Methods。
using (var db = new LiteDatabase(connectionString))
{
var collection = db.GetCollection<Sample>();
// 刪除單筆資料
collection.Delete(id);
// 條件式刪除資料
collection.Delete(x => x.Birthday > new DateTime(2000, 1, 1));
collection.Delete(Query.GT("Birthday", new DateTime(2000, 1, 1)));
}
修改資料
LiteDB 是 Document-Oriented 的資料庫,我們要部份更新 document 中的某個欄位必須先把整個 document 撈出來,把我們想更新的欄位值修改好後再整個 document 寫回去,這就是 Document-Oriented 的特性,LiteDB 提供 Update
方法讓我們用來更新資料。
using (var db = new LiteDatabase(connectionString))
{
var collection = db.GetCollection<Sample>();
var doc = collection.FindById(id);
doc.Name = "Hello World";
// 更新單筆資料
collection.Update(doc);
collection.Update(id, doc);
var docs = collection.Find(x => x.Birthday > new DateTime(2000, 1, 1)).ToList();
foreach (var sample in docs)
{
sample.Birthday = new DateTime(2000, 1, 1);
}
// 更新多筆資料
collection.Update(docs);
}
同場加映 Insert Or Update
通常我們做 Insert Or Update 至少就要寫三段程式碼,先到資料庫找、找到了就執行更新、找不到就執行新增,而 LiteDB 提供了一個非常方便的方法叫 Upsert
,它已經幫我們把 Insert Or Update 的邏輯封裝起來了,我們直接呼叫就行了。
using (var db = new LiteDatabase(connectionString))
{
var collection = db.GetCollection<Sample>();
var doc = new Sample
{
Id = id,
Name = "Hello World",
Phone = "+886912345678",
Address = "中和",
Birthday = new DateTime(2000, 1, 1),
Code = 12345
};
// Insert Or Update 單筆資料
collection.Upsert(doc);
collection.Upsert(id, doc);
// Insert Or Update 多筆資料
collection.Upsert(new List<Sample> { doc });
}
查詢資料
查詢 LiteDB 裡面的資料最基本的就是用 Find
方法,Find 方法裡面可以帶入 Lambda Expression 及 Query Method 兩種參數當做查詢條件。
using (var db = new LiteDatabase(connectionString))
{
var collection = db.GetCollection<Sample>();
// 給入 Lambda Expression 當條件
var results1 = collection.Find(x => x.Name.Equals("Johnny Smith"));
// 給入 Query Method 當條件
var results2 = collection.Find(Query.EQ(nameof(Sample.Name), "Johnny Smith"));
}
以上針對 LiteDB 最基本的 CURD 做介紹,在我們思考著要在 Local 端儲存資料時,LiteDB 是一個很好的選項。