LokiJS

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 17:54, 18 июня 2020.
LokiJs
fraimed
Создатели: TechFort
Разработчики: Joe Minichino
Постоянный выпуск: 1.3
Написана на: JavaScript
Веб-сайт https://github.com/techfort/LokiJS

LokiJS - это документально-ориентированная база данных , похожая на MongoDB, написанная на JavaScript и опубликованная под MIT License. Ее цель - хранить объекты JavaScript ,как документы, в стиле NoSQL и извлекать их с помощью аналогичного механизма.Она поддерживает индексирование, запросы и фильтрацию коллекций данных ,также поддерживает более продвинутые функции, такие как mapReduce и транзакции, а также позволяет вам реализовать пользовательскую удаленную синхронизацию для сохранения данных на сервере (или в локальном файле на мобильном устройстве)[Источник 1]

Применение

LokiJS идеально подходит для следующих сценариев:[Источник 2]

  1. Для клиентской базы данных в памяти (например, хранилище сеансов)
  2. Приложения, критичные к производительности
  3. Мобильные приложения Cordova/PhoneGap, где вы можете использовать возможности JavaScript и избегать взаимодействия с собственными базами данных
  4. Наборы данных загружаются в страницу браузера и синхронизируются в конце рабочего сеанса
  5. Настольные приложения node-webkit
  6. Мобильные приложения NativeScript, сочетающие мощь и повсеместность JavaScript с собственной производительностью и пользовательским интерфейсом
  7. LokiJS поддерживает индексирование и представления и обеспечивает высокую производительность за счет поддержки уникальных и двоичных индексов для данных.

Основные характеристики

  1. Быстродействующая база данных NoSQL в памяти, содержащая коллекции с уникальным индексом (1,1 Мбит / с) и двоичным индексом (500 Кбит / с)
  2. Работает в нескольких средах (браузер,Node.js, NativeScript)
  3. Динамические представления для быстрого доступа к подмножествам данных
  4. Встроенные адаптеры персистентности и возможность поддержки пользовательских
  5. Изменяемое API
  6. Join'ы (объединения)

[Источник 2]

Текущее состояние

Последняя версия LokiJS - 1.3 [Eostre].

Поскольку LokiJS написана на JavaScript, то ее можно запускать в любой среде, поддерживающей JavaScript, такой как браузеры, Node.js / node-webkit, мобильная среда NativeScript и гибридные мобильные приложения (такие как phonegap / cordova).

Установка

Если у вас установлен bower ,то в консоль прописываем
 bower install lokijs 
Если у вас установлен npm [Источник 3], то
nmp i lokijs 

Если вам нужно установить LokiJS глобально, то следует после команды прописать тег -g , а если для какого-то конкретного проекта, то обязательно все установки провести в папке проекта.

Особенности

  • Ориентированный на документ

Данные хранятся в виде объектов JavaScript, сериализованных в JSON для сохранения на диске.

  • Индексирование

Можно указать индексы для ускорения поиска по определенным свойствам объекта. Поле 'id' автоматически индексируется и использует алгоритм двоичного поиска, чтобы избежать более медленных циклов (;;)

  • Вьюшки (представления)

Можно объявить пользовательские функции представления для возврата наборов результатов на основе сложной логики.

  • MapReduce

Можно объявить map и сократить функции для извлечения совокупных данных из вашей базы данных.[Источник 1]

Пример использования

Если вы работаете в среде Node.js, запустите npm install lokijs( о чем писалось выше) и обязательно вызовите
var loki = require ('lokijs')

Ниже будут рассмотрены простейшие примеры по использованию данной БД,а больше примеров вы сможете найти тут. Так же для изучения синтаксиса стоит посетить документацию

Создание БД:

var db = new loki ('Пример');

Создание коллекции, указав имя, тип, поля индекса :

var users = db.addCollection ('users', {indices: ['email']});
// стоит обратить внимание, что индексы могут быть одной строкой или массивом строк

Обратите внимание, что индексы и транзакционный флаг являются необязательными параметрами. Транзакции в LokiJS просто позволяют запускать операции и автоматически восстанавливать базу данных до того уровня, на котором она находилась до начала транзакции, если произошла ошибка.

Добавление группы пользователей в базу данных:

var odin = users.insert( { name : 'odin', email: 'odin.soap@lokijs.org', age: 38 } );
var thor = users.insert( { name : 'thor', email : 'thor.soap@lokijs.org', age: 25 } );
var stan = users.insert( { name : 'stan', email : 'stan.soap@lokijs.org', age: 29 } );
var oliver = users.insert( { name : 'oliver', email : 'oliver.soap@lokijs.org', age: 31 } );
var hector = users.insert( { name : 'hector', email : 'hector.soap@lokijs.org', age: 15} );
var achilles = users.insert( { name : 'achilles', email : 'achilles.soap@lokijs.org', age: 31 } );

Управление обновлением:

stan.name = 'Stan Laurel';
// обновление объекта (синхронизируется индекс)
users.update (стан);

DynamicViews (рекомендуемый подход):

var dv = users.addDynamicView ('a_complex_view');
dv.applyWhere (функция aCustomFilter (obj) {
 return obj.name.length <5 && obj.age> 30;
});
// просмотр данных
console.log (dv.data ());

// применение изменений
users.insert({ name: 'ratatosk', email: 'rata@tosk.r', age: 10320 });
// обновление динамического представления
console.log (dv.data ());

Функции фильтра «Whare»:

function ageView(obj){
  return obj.age > 30;
}
// более сложный пример, пользователи с именами длиннее 3 символов и старше 30 лет
function aCustomFilter(obj){
  return obj.name.length  < 5 && obj.age > 30;
}

// проверка фильтров
var result = users.where(ageView);
var anotherResult = users.where(aCustomFilter);

MapReduce (реальный пример можно найти на lokijs.org):

function getDuration( obj ){
  return obj.complete ? null : obj.duration;
}


function getAverage( array ){
  var cumulator = 0;
  var i = array.length >>> 0;
  var actual = 0;
  while(i--){
    if(array[i] != null){
      cumulator += array[i];
      actual++;
    }
  }
  return ( cumulator / actual).toFixed(2);
}

var avgDuration = todos.mapReduce( getDuration, getAverage );

Запросы через цепочку методов:

users.chain()
  .find({'age':{'$gt': 25}})
  .where(function(obj){ return obj.name.indexOf("in") != -1 })
  .simplesort("age")
  .offset(50)
  .limit(10)
  .data()

Простое именованное преобразование:

users.addTransform('progeny', [
  {
    type: 'find',
    value: {
      'age': {'$lte': 40}
    }
  },
  {
    type: 'simplesort',
    property: 'age',
    desc: true
  }
]);

var results = users.chain('progeny').data();

Проблемы

Если в ходе изучения и применения у вас возникают какие-либо вопросы или ошибки , то стоит обратиться сюда(StackOverflow), возможно,с вашей проблемой разобрались до вас

Источники

  1. 1,0 1,1 LokiJS : wiki // Github [2013 — ]. Дата обновления: 19.12.2019. URL: https://github.com/techfort/LokiJS/wiki (дата обращения: 28.05.2020)
  2. 2,0 2,1 LokiJS : официальный репозиторий // Github [2013 — ]. Дата обновления: 2017 год. URL: https://github.com/techfort/LokiJS (дата обращения: 28.05.2020)
  3. LokiJS // npm [2013 — ]. Дата обновления: 20.12.2019. URL: https://www.npmjs.com/package/lokijs (дата обращения: 29.05.2020)