JSPM

mikro-orm

0.6.0
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 183419
  • Score
    100M100P100Q170735F
  • License MIT

Simple typescript mongo ORM for node.js based on data-mapper, unit-of-work and identity-map patterns

Package Exports

  • mikro-orm

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (mikro-orm) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

mikro-orm

Simple typescript mongo ORM for node.js based on data-mapper, unit-of-work and identity-map patterns.

Heavily inspired by doctrine.

Dependency Status Build Status Coverage Status

Defining entity

import { BaseEntity, Entity, ManyToOne, Property } from 'mikro-orm';
import { Publisher } from './Publisher';
import { Author } from './Author';
import { BookRepository } from './BookRepository';

@Entity({ collection: 'books-table', customRepository: BookRepository })
export class Book extends BaseEntity {

  @Property()
  title: string;

  @ManyToOne({ entity: () => Author.name })
  author: Author;

  @ManyToOne({ entity: () => Publisher.name })
  publisher: Publisher;

  @Property()
  metaObject: object;

  @Property()
  metaArray: any[];

  @Property()
  metaArrayOfStrings: string[];

  constructor(title: string, author: Author) {
    super();
    this.title = title;
    this.author = author;
    this.metaObject = {};
    this.metaArray = [{test: 123, lol: true}];
    this.metaArrayOfStrings = ['test'];
  }

}

Installation

$ yarn add mikro-orm

or

$ npm install mikro-orm

Usage

For more examples, take a look at tests/EntityManager.test.ts.

import { MikroORM, Collection } from 'mikro-orm';
import { Author } from './entities/Author';
import { Published } from './entities/Published';
import { Book } from './entities/Book';

const orm = await MikroORM.init({
  entitiesDirs: ['entities'], // relative to `baseDir`
  dbName: 'my-db-name',
  baseDir: __dirname,
});

// use constructors in your entities
const author = new Author('Jon Snow', 'snow@wall.st');
author.born = new Date();

const publisher = new Publisher('7K publisher');

const book1 = new Book('My Life on The Wall, part 1', author);
book1.publisher = publisher;
const book2 = new Book('My Life on The Wall, part 2', author);
book2.publisher = publisher;
const book3 = new Book('My Life on The Wall, part 3', author);
book3.publisher = publisher;

await orm.em.persist(book1, false);
await orm.em.persist(book2, false);
await orm.em.persist(book3); // flush everything to database

const authorRepository = orm.em.getRepository<Author>(Author.name);
const jon = await authorRepository.findOne({ name: 'Jon Snow' }, ['books']);
const authors = await authorRepository.findAll(['books']);

// identity map in action
console.log(jon === authors[0]); // true

for (const author of authors) {
  console.log(author.name); // Jon Snow

  for (const book of author.books) {
    console.log(book.title); // initialized
    console.log(book.author.isInitialized()); // true
    console.log(book.author.id);
    console.log(book.author.name); // Jon Snow
    console.log(book.publisher); // just reference
    console.log(book.publisher.isInitialized()); // false
    console.log(book.publisher.id);
    console.log(book.publisher.name); // undefined
  }
}

// filtering and pagination
const booksRepository = orm.em.getRepository<Author>(Author.name);
const books = await booksRepository.find({ author: jon.id }, [], { title: -1 }, 2, 1);
console.log(books);

TODO

  • cascade persist in collections
  • aggregate support?
  • improve populating in EM#find() method
  • rehydrate and populate missing references when fetching already loaded entities from db
  • add nativeUpdate and nativeDelete (without hooks support), allow only entities in EM#remove
  • remove references on other entities when deleting entity (e.g. from M:N collection)
  • support for string ids in find query

TODO docs

  • 1:M / M:1 collections
  • many to many collections
  • custom repository
  • cascading
  • identity map
  • lifecycle hooks