0.5.2 • Published 4 months ago

mharj-mongoose-cache v0.5.2

Weekly downloads
-
License
LGPL-2.0-only
Repository
github
Last release
4 months ago

Mongoose model cache

This needs only minimal interaction with database if can feed cache with change stream or pre/post hooks or on model creation/delete calls. Can be easily hooked up with cache event's to push data to presentation layers.(i.e. websockets, other services)

Create cache instance

export const SomeCache = new ModelCache<SomeDocument>('Some', {logger: console});

import data

SomeCache.import(await SomeModel.find());

Get value(s)

const someModel = SomeCache.list().find((s) => s.something === true);

const someModels = SomeCache.list().filter((s) => s.something === true);

Get value(s) with binded method

const SomeList = SomeCache.list;

const someModel = SomeList().find((s) => s.something === true);

const someModels = SomeList().filter((s) => s.something === true);

get document with id

const subDocument = SubDocCache.get(someModel.subId);

"populate" document id array

const subDocuments = SubDocCache.getArray(someModel.subIdList);

Listen cache updates

SomeCache.on('updated', () => {
	// do something
});

Iterator to iterate over cache in chunks

const carChunkSession: ChunkSession<ICar> = CarCache.getChunkSession(1000, {sort: (a, b) => a.name.localeCompare(b.name)});
const iter: IterableIterator<DocumentCacheSessionChunk<ICar>> = carChunkSession.getIterator();
let current: IteratorResult<DocumentCacheSessionChunk<ICar>> = iter.next();
while (!current.done) {
	const value: DocumentCacheSessionChunk<ICar> = current.value;
	values.total // total number of documents in cache
	values.current // current number of iterated documents
	values.chunk // array of 1000 or less documents in this chunk
}
// you can check if there is more chunks based on current iterated documents and total documents in cache
// or wait for next chunk to be .done === true

Example: Hookup with mongoose change stream

changeStream = SomeModel.watch(undefined, {fullDocument: 'updateLookup'});
changeStream.on('change', (change) => {
	if (change.operationType === 'delete') {
		const model = SomeCache.get(change._id);
		if (model) {
			SomeCache.delete(model);
		}
	} else {
		if (change.fullDocument) {
			SomeCache.add(SomeModel.hydrate(change.fullDocument));
		}
	}
});

Example: on Model create/delete

const someModel = await new SomeModel({something: true}).save();
SomeCache.add(someModel);
0.5.0

4 months ago

0.4.0

4 months ago

0.5.2

4 months ago

0.3.5

7 months ago

0.3.2

11 months ago

0.3.1

11 months ago

0.3.4

9 months ago

0.3.3

11 months ago

0.3.0

1 year ago

0.2.1

1 year ago

0.2.3

1 year ago

0.2.2

1 year ago

0.2.4

1 year ago

0.2.0

2 years ago

0.1.1

2 years ago

0.1.0

2 years ago

0.0.5

2 years ago

0.0.4

2 years ago

0.0.3

2 years ago

0.0.2

2 years ago

0.0.1

2 years ago