Skip to content

qualialabs/mapped-collection

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

qualia:mapped-collection

Maintain a projection of a MongoDB collection in memory on your Meteor server, for awesome possibilities!

Available on Atmosphere.

Usage

Let's say we have a collection of Orders and we want to search through them, but MongoDB queries aren't quite expressive enough.

We only need to search over a small subset of the fields on each document. With MappedCollection, we can project each order into an ES6 Map in memory, then run an arbitrary search algorithm on the map using normal JavaScript!

First, we create the MappedCollection, specifying the collection we would like to map into memory, and which fields we should project from each document:

import {MappedCollection} from 'meteor/qualia:mapped-collection';

const mappedFields = [
  'order_number',
  '_search.borrower_names',
  '_search.seller_names',
  '_search.lender_names',
  '_search.property_addresses',
  'properties.brief_legal_description',
  'cdf.loans.loan_number',
  'hud1.loans.loan_number',
  'status',
];

const mappedOrders = new MappedCollection({
  collection: Orders,
  fields: mappedFields,
});

Provide an array of field names or a Meteor-style fields object in fields.

Internally, MappedCollection uses an observe to keep its map in sync with the collection.

After we construct mappedOrders, it might still be waiting to build the map asynchronously. When our mappedOrders are ready, the Promise mappedOrders.ready will resolve.

The map is available on the MappedCollection as map, and we use it to get the values for our search once the map is ready:

import lasr from 'meteor/qualia:lasr';

// mappedOrders.ready resolves when the map is fully initialized
Promise.await(mappedOrders.ready);

// mappedOrders.map is a normal ES6 Map
const orders = Array.from(mappedOrders.map.values());

// Here, we search for some orders, but you can do anything with the map!
const results = lasr.search({
  items: orders,
  query,
  keys: ['order_number'],
  limit: 10,
});

Here, we use lasr for our search, but you could use any search package, or do something unrelated to search!

About

Memory-mapped Mongo collections in Meteor

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published