LiteDB is a small, fast and lightweight NoSQL embedded database.
- Serverless NoSQL Document Store
- Simple API similar to MongoDB
- 100% C# code for .NET 3.5 / NETStandard 1.4 in a single DLL (less than 200kb)
- Support for Portable UWP/PCL (thanks to @negue and @szurgot)
- Thread safe and process safe
- ACID transactions
- Data recovery after write failure (journal mode)
- Datafile encryption using DES (AES) cryptography
- Map your POCO classes to
BsonDocument
using attributes or fluent mapper API - Store files and stream data (like GridFS in MongoDB)
- Single data file storage (like SQLite)
- Index document fields for fast search (up to 16 indexes per collection)
- LINQ support for queries
- Shell command line - try this online version
- Pretty fast - compare results with SQLite here
- Open source and free for everyone - including commercial use
- Install from NuGet:
Install-Package LiteDB
- New
LiteRepository
class to simple repository pattern data access see here - Collection names could be
null
and will be resolved byBsonMapper.ResolveCollectionName
user function (default:typeof(T).Name
)
Try LiteDB Web Shell. For security reasons, in the online version not all commands are available. Try the offline version for full feature tests.
Visit the Wiki for full documentation
Download the source code or binary only in LiteDB Releases
A quick example for storing and searching documents:
// Create your POCO class
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string[] Phones { get; set; }
public bool IsActive { get; set; }
}
// Open database (or create if doesn't exist)
using(var db = new LiteDatabase(@"MyData.db"))
{
// Get customer collection
var col = db.GetCollection<Customer>("customers");
// Create your new customer instance
var customer = new Customer
{
Name = "John Doe",
Phones = new string[] { "8000-0000", "9000-0000" },
Age = 39,
IsActive = true
};
// Create unique index in Name field
col.EnsureIndex(x => x.Name, true);
// Insert new customer document (Id will be auto-incremented)
col.Insert(customer);
// Update a document inside a collection
customer.Name = "Joana Doe";
col.Update(customer);
// Use LINQ to query documents (will create index in Age field)
var results = col.Find(x => x.Age > 20);
}
Using fluent mapper and cross document reference for more complex data models
// DbRef to cross references
public class Order
{
public ObjectId Id { get; set; }
public DateTime OrderDate { get; set; }
public Address ShippingAddress { get; set; }
public Customer Customer { get; set; }
public List<Product> Products { get; set; }
public decimal Total => Products.Sum(p => p.Price);
}
// Re-use mapper from global instance
var mapper = BsonMapper.Global;
// "Produts" and "Customer" are from other collections (not embedded document)
mapper.Entity<Order>()
.DbRef(x => x.Customer, "customers") // 1 to 1/0 reference
.DbRef(x => x.Products, "products") // 1 to Many reference
.Field(x => x.ShippingAddress, "addr") // Embedded sub document
.Index(x => x.OrderDate) // Index this field
.Ignore(x => x.Total); // Do not store this
using(var db = new LiteDatabase("MyOrderDatafile.db"))
{
var orders = db.GetCollection<Order>("orders");
// When query Order, includes references
var query = orders
.Include(x => x.Customer)
.Include(x => x.Products) // 1 to many reference
.Find(x => x.OrderDate <= DateTime.Now);
// Each instance of Order will load Customer/Products references
foreach(var order in query)
{
var name = order.Customer.Name;
...
}
}
- Desktop/local small applications
- Application file format
- Small web applications
- One database per account/user data store
- Few concurrent write operations
- A GUI tool: https://github.com/falahati/LiteDBViewer
- Lucene.NET directory: https://github.com/sheryever/LiteDBDirectory
Change details for each release are documented in the release notes.
Copyright (c) 2017 - Maurício David
A special thanks to @negue and @szurgot helping with portable version.