qualia:mapped-collection
Maintain a projection of a MongoDB collection in memory on your Meteor server, for awesome possibilities!
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:
1import {MappedCollection} from 'meteor/qualia:mapped-collection'; 2 3const mappedFields = [ 4 'order_number', 5 '_search.borrower_names', 6 '_search.seller_names', 7 '_search.lender_names', 8 '_search.property_addresses', 9 'properties.brief_legal_description', 10 'cdf.loans.loan_number', 11 'hud1.loans.loan_number', 12 'status', 13]; 14 15const mappedOrders = new MappedCollection({ 16 collection: Orders, 17 fields: mappedFields, 18});
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:
1import lasr from 'meteor/qualia:lasr'; 2 3// mappedOrders.ready resolves when the map is fully initialized 4Promise.await(mappedOrders.ready); 5 6// mappedOrders.map is a normal ES6 Map 7const orders = Array.from(mappedOrders.map.values()); 8 9// Here, we search for some orders, but you can do anything with the map! 10const results = lasr.search({ 11 items: orders, 12 query, 13 keys: ['order_number'], 14 limit: 10, 15});
Here, we use lasr for our search, but you could use any search package, or do something unrelated to search!