C#でLiteDBを試してみた。

コンピュータ

LiteDBはSQLを書かずにC#のマネージドオブジェクトとして扱えるデータベースです。

アプリケーションのバックエンドに良さそうなので試してみました。

プロジェクトの作成

mkidr LiteDBSample
cd LiteDBSample
dotnet new console -f net8.0
dotnet add package LiteDB

サンプルコード

using LiteDB;

namespace LiteDBSample;
public class LiteDbKeyValueStore<TValue> : IDisposable
{
    private readonly LiteDatabase _db;
    private readonly ILiteCollection<Entry> _collection;

    public LiteDbKeyValueStore(string dbPath = "kvstore.db")
    {
        _db = new LiteDatabase(dbPath);
        _collection = _db.GetCollection<Entry>("kv_" + typeof(TValue).Name.ToLower());
        _collection.EnsureIndex(x => x.Key, true);
    }

    private record Entry
    {
        [BsonId]
        public string Key { get; set; } = string.Empty;
        public TValue? Value { get; set; } = default;
    }

    public void Set(string key, TValue value)
    {
        _collection.Upsert(new Entry { Key = key, Value = value });
    }

    public TValue? Get(string key)
    {
        var entry = _collection.FindById(key);
        return entry is null ? default : entry.Value;
    }

    public bool ContainsKey(string key)
    {
        return _collection.Exists(x => x.Key == key);
    }

    public bool Remove(string key)
    {
        return _collection.Delete(key);
    }

    public void Clear()
    {
        _collection.DeleteAll();
    }

    public void Dispose()
    {
        _db.Dispose();
    }
}

class Program
{
    static void Main()
    {
        using var db = new LiteDbKeyValueStore<int>();
        for (int i = 0; i < 5; i++)
        {
            string key = $"key_{i}";
            int val = i;
            db.Set(key, val);
        }

        string key1 = "key_1";
        if (db.ContainsKey(key1))
        {
            int val1 = db.Get(key1);
            Console.WriteLine($"{key1}: {val1}");
// key_1: 1
        }

        Console.WriteLine("");
        db.Remove(key1);

        for (int i = 0; i < 5; i++)
        {
            string key2 = $"key_{i}";
            if (db.ContainsKey(key2))
            {
                int val2 = db.Get(key2);
                Console.WriteLine($"{key2}: {val2}");
            }
        }
// key_0: 0
// key_2: 2
// key_3: 3
// key_4: 4

        db.Clear();

    }
}

感想

LiteDBはファイルベースのスタンドアロンのデータベースで、そのカテゴリではSQLiteが有名です。
SQLiteは色々なプログラミング言語に対応していてSQLを使うデータベースですが、LiteDBは多分C#専用でSQLを書かずにデータベースを操作する点が特徴です。
SQLを使うタイプのデータベースの場合、取得したデータをプログラミング言語下の変数に代入する作業が必要になり、定型的な処理ですのでORMを使うことがあります。
その点LiteDBはデータベースから取得したデータが、C#のオブジェクトを取得できる分、コードがシンプルになる点がメリットだと思います。
SQLiteほどの機能は無いと思いますが、サンプルコードのように重複しないキーがありそれに紐づくデータを永続化させたい場合など、シンプルなデータ構造の場合LiteDBの真価が発揮される用途だと考えます。

コメント