LokiJs
Introduction¶
In-memory JavaScript Datastore with Persistence.
Usage¶
Create database¶
var db = new loki();
// var db = new loki('loki.json', config); // load database from file
Create collection¶
var collection = db.addCollection(name);
// var collection = db.addCollection(name, config);
Get collection¶
var collection = db.getCollection(name);
Insert document¶
var docInColl = collection.insert(doc); // doc: an object
Get Id
var id = docInColl.$loki;
Insert documents¶
collection.insert(docArray); // documents in array
Query¶
Get document by id¶
var doc = collection.get(id); // id: `$loki`
Get doc by unique index¶
var doc = collection.by(key, value);
Filter documents¶
- $eq : filter for document(s) with property of (strict) equality
var docArray = collection.find({key: value}); // var docArray = collection.find({key: {'$eq': value}); - $aeq : filter for document(s) with property of abstract (loose) equality
For example
var docArray = collection.find({key: {'$aeq': value}});var results = coll.find({age: {'$aeq': 20}}); // age == '20' or age == 20 - $ne : filter for document(s) with property not equal to provided value
var docArray = collection.find({key: {'$ne': value}}); - $gt : filter for document(s) with property greater than provided value
var docArray = collection.find({key: {'$gt': value}}); - $gte : filter for document(s) with property greater or equal to provided value
var docArray = collection.find({key: {'$gte': value}}); - $lt : filter for document(s) with property less than provided value
var docArray = collection.find({key: {'$lt': value}}); - $lte : filter for document(s) with property less than or equal to provided value
var docArray = collection.find({key: {'$lte': value}}); - $between : filter for documents(s) with property between provided values
var docArray = collection.find({key: {'$between': [value0, value1]}}); - $in : filter for document(s) with property matching any of the provided array values
Your property should not be an array but your compare values should be.
var docArray = collection.find({key: {'$in': [value0, value1, ...]}}); - $nin : filter for document(s) with property not matching any of the provided array values
var docArray = collection.find({key: {'$nin': [value0, value1, ...]}}); - $contains : filter for document(s) with property containing the provided value
Use this when your property contains an array but your compare value is not an array
var docArray = collection.find({key: {'$contains': value}}); - $containsAny : filter for document(s) with property containing any of the provided values
var docArray = collection.find({key: {'$containsAny': [value0, value1, ...]}}); - $containsNone : filter for documents(s) with property containing none of the provided values
var docArray = collection.find({key: {'$containsNone': [value0, value1, ...]}}); - $regex : filter for document(s) with property matching provided regular expression
For example
var docArray = collection.find({key: {'$regex': pattern}}); // var docArray = collection.find({key: {'$regex': [pattern, options]});var docArray = collection.find({key: { '$regex': 'din' }}); var docArray = collection.find({key: { '$regex': ['din', 'i'] }}); - $dteq: filter for document(s) with date property equal to provided date value
var docArray = collection.find({key: {'$dteq': new Date('1/1/2017')}}); - $type : filter for documents which have a property of a specified type
var docArray = collection.find({key: {'$type': value}}); // 'string', or 'number', ... - $size : filter for documents which have array property of specified size
(does not work for strings)
var docArray = collection.find({key: {'$size': value}}); - $len : filter for documents which have string property of specified length
var docArray = collection.find({key: {'$len': value}}); - $or : filter for documents which meet any of the nested subexpressions
var docArray = collection.find({'$or': [ {key0: {'$lt': value0}}, {key1: {'$gte': value1}}, // ... ]});
Find one document¶
var doc = collection.findOne({});
Filter by function¶
var docArray = collection.where(function(doc){
// ...
return isPicked; // true to pick this document
})
Sort¶
- Sort with a key
var docArray = collection.chain().find({}).simplesort(key).data(); // ascending // var docArray = collection.chain().find({}).simplesort(key, {desc: true}).data(); // descending - Sort with mutiple keys
var docArray = collection.chain().find({}).compoundsort([key0, key1]).data(); // key0, key1: ascending // var docArray = collection.chain().find({}).compoundsort([key0, [key1, true]]).data(); // key0: ascending, key1: descending - Sort with function
result:
var docArray = collection.chain().find({}).sort( function(doc1, doc2) { return result; // 0, 1, -1 }) .data();0: equal1: greater-1: less
Pagination¶
Get documents from start to start+count-1.
var docArray = collection.chain().find({}).offset(start).limit(count).data();
Update¶
Update each filtered documents.
var docArray = collection.chain().find({}).update(
function(doc) {
//
return doc;
});
Remove¶
Remove filtered documents.
collection.chain().find({}).remove();
Map¶
Map document into a new anonymous collection, won't affect original collection.
var docArray = collection.chain().find({}).map(
function(doc) {
// ...
return doc
})
.data();
Map-reduce¶
- Map document into a new anonymous collection
- Run reduceFn to get final result value from result set of step 1.
var mapFn = function(doc) {
// ...
return doc
};
var reduceFn = function(docArray) {
// ...
return result;
}
var result = collection.chain().find({}).mapReduce(mapFn, reduceFn);
Clone result set¶
var resultSet = collection.chain().find({});
var resultSetClone = resultSet.branch();
// resultSetClone.find({}).data();
Dynamic view¶
- Create dynamic view
var view = children.addDynamicView(name); - Add filters
- find
view.applyFind({}); - where
view.applyWhere(function(doc) { return true; }); - simple sort
view.applySimpleSort(key); - sort by multiple keys
view.applySortCriteria([key0, key1]); // view.applySortCriteria([key0, [key1, true]]); - sort function
result:
view.applySort(function(doc1, doc2) { return result; // 0, 1, -1 });0: equal1: greater-1: less
- find
- Get result data
var docArray = view.data();
Add new filters
var docArray = view.branchResultset().find({}).data();
Speed-up quering¶
Custom unique index¶
- Define custom unique index
var collection = db.addCollection(name, { unique: [key0] }); - Get document by custom unique index
var doc = collection.by(key0, value);
Binary indices¶
- Define binary index
Or
var collection = db.addCollection(name, { indices: [key0] });collection.ensureIndex(key); - Get documents by normal filters
var docArray = collection.find({key0: {'$gt': value}});
Methods of collection¶
- Average value of a property
var avgValue = collection.avg(key); - Maximum value of a property
var maxValue = collection.max(key); - Minimum value of a property
var minValue = collection.min(key); - Median value of a property
var medianValue = collection.median(key); - Amount of documents
var amount = collection.count(query); // {key: {'$gt': value}}
Serialize & Deserialize¶
- Database as string
var s = db.serialize(); - Load database from string
db.loadJSON(s);