今天給大家介紹一個不錯的小巧輕量級的NoSQL文件數據庫LiteDB。本博客在2013年也介紹過2款.NET平台的開源數據庫:
上面2個數據庫我的實際的項目中用過,還不錯。當然數據量很小,主要是客戶比較變態,必須要用xml文件保存,就想到了,另外NDatabase只是自己覺得好玩,也用了一下。
提示:沒有x86,x64之分,可以AnyCPU使用。4.5版本也可以使用,如果需要專門的4.5版本,可以自己編譯,另外Mono的問題,官方沒有提到,應該是暫時不支持,自己也沒有環境,不好測試,希望有環境的朋友,可以用簡單代碼測試一下。
.NET開源目錄:【目錄】本博客其他.NET開源項目文章目錄
本文原文地址:.NET平台開源項目速覽(3)小巧輕量級NoSQL文件數據庫LiteDB
1.LiteDB初步介紹
1.1 基本功能預覽
LiteDB是一個小型的.NET平台開源的NoSQL類型的輕量級文件數據庫。特點是小和快,dll文件只有200K大小,而且支持LINQ和命令行操作,數據庫是一個單一文件,類似Sqlite。
主要特點有(翻譯官方介紹,如有不准確,請指正):
1.NoSQL文件存儲。這是和傳統關系型數據庫的主要區別;支持實體類的字段更新;
2.類似MongoDB的簡單API;
3.完全使用C#代碼,在.NET 4.0環境下編寫,核心dll小巧,只有168K;
4.支持ACID事務處理;
5.可以進行寫入失敗的恢復;
6.存儲到文件或者數據流中(類似MongoDB的GridFS);
7.類似Sqlite的單一文件存儲;
8.支持文件索引,可以進行快速搜索;可以直接存儲文件;
9.支持Linq查詢;【這也許是C#編寫最直接的好處】;
10.支持命令行操作數據庫,官方提供了一個Shell command line;
11.完全開源和免費,包括商業使用;
1.2 使用場景
雖然小巧,但也不是萬能的,LiteDB給出了幾個可能或者比較適合使用的場景。大家可以根據實際情況進行或者根據需要進行測試,看是不是自己需要的:
1.桌面或者本地小型的應用程序
2.小型web應用程序
3.單個數據庫賬戶或者單個用戶數據的存儲
4.少量用戶的並發寫操作的應用程序
2.LiteDB使用基本案例
上面只是基本介紹,先從搞一個簡單的案例介紹如何使用。大家可以感覺一下。如果要具體使用,就好好研究下官方的文件。本文下面幾節也將大概介紹一下LiteDB的相關原理和技術細節。有空我會做一個大數據下的測試,看看如何。這里只是為了介紹給大家研究而已。
2.1 創建實體類
為了例子需要,我們創建一個簡單的實體類,如下面所示,只包括幾個基本的屬性信息。
public class Customer { public int Id { get; set; } public string Name { get; set; } public string[] Phones { get; set; } public bool IsActive { get; set; } }
2.2 使用Demo
使用過程首先要添加dll應用,以及引入命名空間:
using LiteDB;
下面是測試代碼,會在當前目錄下創建一個sample.db的數據庫文件:
//打開或者創建新的數據庫 using (var db = new LiteDatabase("sample.db")) { //獲取 customers 集合,如果沒有會創建,相當於表 var col = db.GetCollection<Customer>("customers"); //創建 customers 實例 var customer = new Customer { Name = "John Doe", Phones = new string[] { "8000-0000", "9000-0000" }, IsActive = true }; // 將新的對象插入到數據表中,Id是自增,自動生成的 col.Insert(customer); // 更新實例 customer.Name = "Joana Doe"; //保存到數據庫 col.Update(customer); // 使用對象的屬性,這個方法生成索引,來進行檢索 col.EnsureIndex(x => x.Name); //使用LINQ語法來檢索 var results = col.Find(x => x.Name.StartsWith("Jo")); }
上述過程很清楚,根據注釋理解幾乎不用費神。
3.LiteDB的技術細節
例子的使用簡單,但其實還不夠全面,本節就稍微翻譯一下LiteDB官方提供的一些技術資料和文檔。讓你對LiteDB更加了解和易於使用。
3.1.LiteDB的工作原理
本節翻譯自:https://github.com/mbdavid/LiteDB/wiki/How-LiteDB-Works
LiteDB是雖然單個文件類型的數據庫,但是數據庫有很多信息,例如索引,集合,文件等。為了管理這些信息,LiteDB實現了數據庫頁的概念。頁 是一個擁有4096 字節的 存儲相同信息的地址塊。頁 也是操作磁盤文件(讀寫)的最小單元。LiteDB有6種頁類型。其作用也不一樣,分布是:Header Page,Collection Page,Index Page, Data Page,Extend Page,Empty Page。鑒於篇幅較大,這里只介紹重要的Data Page。其他幾個頁面的作用看文件也很容易。Data Page的作用是存儲核心的數據,是以序列化后的BSON格式來存儲。值得注意的是,如果存儲的數據太大,超過page大小,數據塊就會使用一個指針指向Extend Page。
在上面的代碼中,我們初始化數據庫是這樣的:
var db = new LiteDatabase("MyData.db");
這種情況比較好用,可以打開或者創建新的數據庫,同樣也可以使用連接名稱來獲取,例如:
var db = new LiteDatabase("userdb");
這樣會直接從connectionStrings找到這個名稱的連接。包括了文件名稱,使用模式,以及版本信息。一般情況下直接使用第一種即可。
LiteDB的數據庫連接完整形式是:filename=C:\Path\mydb.db; journal=false; version=5
3.2 LiteDB的查詢
本節翻譯自:https://github.com/mbdavid/LiteDB/wiki/Queries
LiteDB的查詢必須在相關的查詢字段上使用索引,如果沒有索引,會默認去創建索引。上面例子中就是創建字段的索引,並查詢。LiteDB中查詢有2種方法:
1.使用靜態的幫助類Query;
2.使用Linq方式,就是類似Demo的方法;
LiteDB使用Query的查詢方式有以下一些方法,詳細講解幾個重要的,其他幾個大家理解一下,也應該不難,如果有不准確的地方,還請指正:
Query.All 返回所有的數據,可以使用指定的索引字段進行排序
Query.EQ 查找返回和指定字段值相等的數據
Query.LT/LTE 查找< 或 <= 某個值的數據
Query.GT/GTE 查找> 或 >= 某個值的數據
Query.Between 查找在指定區間范圍內的數據
Query.In - 和SQL的in類似吧,查找和列表中值相等的數據
Query.Not - 和EQ相反,是不等於某個值的數據
Query.StartsWith 查找以某個字符串開頭的數據
Query.Contains 查找保護某個字符串的數據,這個查詢只掃描索引
Query.And 2個查詢的交集
Query.Or 2個查詢結果的並集
看看實際代碼:
var results = collection.Find(Query.EQ("Name", "John Doe")); var results = collection.Find(Query.GTE("Age", 25)); var results = collection.Find(Query.And( Query.EQ("FirstName", "John"), Query.EQ("LastName", "Doe") )); var results = collection.Find(Query.StartsWith("Name", "Jo"));
如圖,語法是左邊是字段,右邊是值。注意LiteDB不支持這種表達式:CreationDate == DueDate。
下面介紹使用Linq的查詢的幾個主要方法:
FindAll: 查找表或者集合中所有的結果記錄
FindOne:返回第一個或者默認的結果
FindById: 通過索引返回單個結果
Find: 使用查詢表達式或者linq表達式查詢返回結果
看看幾個例子:
collection.EnsureIndex(x => x.Name); var result = collection .Find(Query.EQ("Name", "John Doe")) .Where(x => x.CreationDate >= x.DueDate.AddDays(-5)) .OrderBy(x => x.Age) .Select(x => new { FullName = x.FirstName + " " + x.LastName, DueDays = x.DueDate - x.CreationDate });
當然還有一些方法如:Count() , Exists(),Min() , Max()等方法。。比較好理解。看看linq表達式的查詢案例:
var collection = db.GetCollection<Customer>("customer"); var results = collection.Find(x => x.Name == "John Doe"); var results = collection.Find(x => x.Age > 30); var results = collection.Find(x => x.Name.StartsWith("John") && x.Age > 30);
4.資源其他
LiteDB的介紹就基本完成了,實際還有很多技術細節在官方文檔中。比較簡單也好理解,不再翻譯。這里提供一個2015年5月25日下載的源碼版本和例子源代碼。
源代碼和Demo下載 1.0.2:LiteDB-1.02.rar
同樣,官方沒有提供離線版的CHM文檔,我手動制作了一份,提供下載,如下圖:
特別提醒:幫助文件CHM打開顯示不了請右鍵,屬性,解除鎖定。。。路徑,文件名都不能含有特殊字符,否則也不能打開。。常見問題,有網友問起,提醒一下。
幫助文檔下載地址:CSharp數據庫LiteDB幫助文檔.rar