.NET平台開源項目速覽(3)小巧輕量級NoSQL文件數據庫LiteDB


    今天給大家介紹一個不錯的小巧輕量級的NoSQL文件數據庫LiteDB。本博客在2013年也介紹過2款.NET平台的開源數據庫:

1.【原創】開源.NET下的XML數據庫介紹及入門 

2.【原創】C#開源輕量級對象數據庫NDatabase介紹 

    上面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。

  官方網站:http://www.litedb.org/

    主要特點有(翻譯官方介紹,如有不准確,請指正):

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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM