1. 程式人生 > >.NET平臺開源專案速覽(3)小巧輕量級NoSQL檔案資料庫LiteDB

.NET平臺開源專案速覽(3)小巧輕量級NoSQL檔案資料庫LiteDB

    今天給大家介紹一個不錯的小巧輕量級的NoSQL檔案資料庫LiteDB。本部落格在2013年也介紹過2款.NET平臺的開源資料庫:

    上面2個數據庫我的實際的專案中用過,還不錯。當然資料量很小,主要是客戶比較變態,必須要用xml檔案儲存,就想到了,另外NDatabase只是自己覺得好玩,也用了一下。

提示:沒有x86,x64之分,可以AnyCPU使用。4.5版本也可以使用,如果需要專門的4.5版本,可以自己編譯,另外Mono的問題,官方沒有提到,應該是暫時不支援,自己也沒有環境,不好測試,希望有環境的朋友,可以用簡單程式碼測試一下。

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的工作原理

  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的查詢

  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日下載的原始碼版本和例子原始碼。

  同樣,官方沒有提供離線版的CHM文件,我手動製作了一份,提供下載,如下圖:

特別提醒:幫助檔案CHM開啟顯示不了請右鍵,屬性,解除鎖定。。。路徑,檔名都不能含有特殊字元,否則也不能開啟。。常見問題,有網友問起,提醒一下。

  

相關推薦

.NET平臺開源專案(3)小巧輕量級NoSQL檔案資料庫LiteDB

    今天給大家介紹一個不錯的小巧輕量級的NoSQL檔案資料庫LiteDB。本部落格在2013年也介紹過2款.NET平臺的開源資料庫:     上面2個數據庫我的實際的專案中用過,還不錯。當然資料量很小,主要是客戶比較變態,必須要用xml檔案儲存,就想到了,另外NDatabase只是自己覺得好玩,

.NET平臺開源專案(16)C#寫PDF檔案類庫PDF File Writer介紹

    1年前,我在文章:這些.NET開源專案你知道嗎?.NET平臺開源文件與報表處理元件集合(三)中(第9個專案),給大家推薦了一個開源免費的PDF讀寫元件 PDFSharp,PDFSharp我2年前就看過,用過簡單的例子,不過程式碼沒有寫成專門的文章。最近在查詢資料的時候,又發現一款小巧的寫PDF檔案

.NET平臺開源專案-最快的物件對映元件Tiny Mapper之專案實踐

心情小札:近期換了工作,苦逼於22:00後下班,房間一篇狼藉~ 小翠鄙視到:"你就適合生活在垃圾堆中!!!" 看評論也是挺有價值,同時也看到許多新手同學問道在實際專案中使用的情況。 下面就原作者的程式碼的基礎上略作調整,闡述一下在實際專案場景中的使用: 第一步:瞭解類庫方法:TinyMapper 主

.NET平臺開源專案(14)最快的物件對映元件Tiny Mapper

    好久沒有寫文章,工作甚忙,但每日還是關注.NET領域的開源專案。五一休息,放鬆了一下之後,今天就給大家介紹一個輕量級的物件對映工具Tiny Mapper:號稱是.NET平臺最快的物件對映元件。那就一起看看呢。 臨時更新:感謝@ 的意見,為了避免新手誤解,這裡說明一下,Tiny Mappe

.NET平臺開源專案(20)Newlife.Core中簡單靈活的配置檔案

如果用知乎,可以關注專欄: 記得5年前開始拼命翻讀X元件的原始碼,特別是XCode,但對Newlife.Core 的東西瞭解很少,最多隻是會用用,而且用到的只是九牛一毛。裡面好用的東西太多了。 最近一年時間,零零散散又學了很多,也瞭解了很多,不會寫那總要學會用吧,今天就給大家介紹裡面非常好用的自定義配置檔

.NET平臺開源專案(19)Power BI神器DAX Studio

  PowerBI更新頻繁,已經有點更不上的節奏,一直在關注和學習中,基本的一些操作大概是沒問題,更重要的是注重Power Query,M函式,以及DAX的使用,這才是核心。     上個月研究了DAX的一些語法和公式,發現這玩意看起來簡單,但其實功能非常強大,所以就想和寫程式碼一樣,弄個工具試一下。

.NET平臺開源專案(21)Cron任務排程CronNET

Quartznet大名鼎鼎應該很少有人不知道,相關的開源專案很多,不過那東東對新手來說,有點晦澀,加上哪個Cron表示式,可能一進去雲裡霧裡的。今天給大家介紹一個簡單的在.NET平臺上執行Cron計劃任務的元件CronNET。同時也給大家推介幾個Cron表示式的工具。 1.Cron介紹和工具

.NET平臺開源專案(7)關於NoSQL資料庫LiteDB的分頁查詢解決過程

  在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯) 與 .NET平臺開源專案速覽(3)小巧輕量級NoSQL檔案資料庫LiteDB中,介紹了LiteDB的基本使用情況以及部分技術細節,我還沒有在實際系統中大量使用,但文章釋出後,有不少網友( )反應在實際專案中使用過,效果還

.NET平臺開源專案(11)KwCombinatorics排列組合使用案例(1)

    今年上半年,我在KwCombinatorics系列文章中,重點介紹了KwCombinatorics元件的使用情況,其實這個元件我5年前就開始用了,非常方便,麻雀雖小五臟俱全。所以一直非常喜歡,才寫了幾篇文章推薦給大家。最近在計算足球彩票結果組合過程中,使用的到了其功能,生成排列,非常具有代表性,而且也

.NET平臺開源專案(1)SharpConfig配置檔案讀寫元件

在.NET平臺日常開發中,讀取配置檔案是一個很常見的需求。以前都是使用System.Configuration.ConfigurationSettings來操作,這個說實話,搞起來比較費勁。不知道大家有沒有同感。所以更多時候我還是喜歡使用開源的東西,更加方便簡潔,也穩定。省去自己的麻煩。今天就介紹一個非常精緻

.NET平臺開源專案(9)軟體序列號生成元件SoftwareProtector介紹與使用

  在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下Software Protector序列號生成元件。今天就通過一篇簡單的文章來預覽一下其強大的功能。雖然我人為其已經基本滿足了一個軟體序列號的所有要素,但至於大家用不用得上,還得看大家的需求。總的來

.NET平臺開源專案(10)FluentValidation驗證元件深入使用(二)

    在上一篇文章:.NET平臺開源專案速覽(6)FluentValidation驗證元件介紹與入門(一) 中,給大家初步介紹了一下FluentValidation驗證元件的使用情況。文章從構建間的驗證器開始,到最後的結果,以及複雜驗證等都做了比較深入的講解和使用。但其實一個完整的元件是麻雀雖小五臟俱全

.NET平臺開源專案(2)Compare .NET Objects物件比較元件

    .NET平臺開源專案速覽今天介紹一款小巧強大的物件比較元件。可以更詳細的獲取2個物件的差別,並記錄具體差別,比較過程和要求可以靈活配置。 1.Compare .NET Objects介紹     Compare .NET Objects元件是.NET平臺用於深入比較2個.NET物件的開源元

.NET平臺開源專案(13)機器學習元件Accord.NET框架功能介紹

    Accord.NET Framework是在AForge.NET專案的基礎上封裝和進一步開發而來。因為AForge.NET更注重與一些底層和廣度,而Accord.NET Framework更注重與機器學習演算法以及提供計算機視訊、音訊、訊號處理以及統計應用相關的解決方案。該專案使用C#語言編寫,專

.NET平臺開源專案(5)深入使用與擴充套件SharpConfig元件

  上個月在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧  和 .NET平臺開源專案速覽(1)SharpConfig配置檔案讀寫元件 中都提到了SharpConfig元件,簡單輕量級,速度快,而且還有比較深入的使用介紹。在文章釋出後,也有網友提到一些問題,當時我也沒仔細去分析,在這次我親

.NET平臺開源專案(8)Expression Evaluator表示式計算元件使用

  在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下Expression Evaluator驗證元件。那裡只是概述了一下,並沒有對其使用和強大功能做深入研究,所以今天就通過一篇簡單的文章來預覽一下其強大的功能。本文曾在【原創】.NET開源表示式計算元

.NET平臺開源專案(4).NET文件生成工具ADB及使用

    很久以前就使用ADB這個工具來生成專案的幫助文件。功能強大,在學習一些開源專案的過程中,官方沒有提供CHM幫助文件,所以為了快速的瞭解專案結構和註釋。就生成文件來自己看,非常好用。這也是一個學習方法吧。例如本文在:   上述2篇文章中最後的資源中就手動製作了CHM幫助文件。有時候我們還可

.NET平臺開源專案(6)FluentValidation驗證元件介紹與入門(一)

    在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下FluentValidation驗證元件。那裡只是概述了一下,並沒有對其使用和強大功能做深入研究,所以今天以及接下去的幾篇文章就專門介紹這個元件。不僅僅是它小,輕量級,優雅,而且一直在持續更新中

.NET平臺開源專案(12)雜湊演算法集合類庫HashLib

    .NET的System.Security.Cryptography名稱空間本身是提供加密服務,雜湊函式,對稱與非對稱加密演算法等功能。實際上,大部分情況下已經滿足了需求,而且.NET實現的都是目前國際上比較權威的,標準化的演算法,所以還是安全可靠的。但也有一些場合,需要自己實現一些安全雜湊演算法。

.NET平臺開源專案(18)C#平臺JSON實體類生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析複雜字串,json一定要用JsonMapper麼?中介紹了簡單的JSON解析的問題,那種方法在當時的環境是非常方便的,因為不需要生成實體類,結構很容易解析。但隨著業務的變化,也會碰到超級變態的JSON,如果還按照以前的思路,會把人搞抽風掉,一旦結構變化,又要重來。所