I’m experiencing with MongoDB with Node.js using the plugin node-mongodb-native. A problem I’m experiencing is the amount of nested callbacks. I’m trying to simplify a few things by lessening the code required for a query.
Instead of this …
db.collection("test", function(err, collection) {
collection.find(...).toArray(function(err, results) {
// ...
});
});
… I was thinking of building an object which acts as a cache of collections so that the first callback is not necessary. I’m using the following code for building the object:
var collections = {};
["test", "foo"].forEach(function(name) {
db.collection(name, function(err, coll) {
collections[name] = coll;
});
});
With it, I’m able to clean up the first code snippet to:
collections.test.find(...).toArray(function(err, results) {
// ...
});
I was wondering whether this is a good practice. It works just fine, but I guess the callback of getting a collection is there for a reason. Does it make sense to build a collection cache as I’m doing now?
That completely depends on what a collection object is.
– Is it live?
– Is it connected to the database?
– Does it do any internal caching?
– Does it reflect new data?
Without knowing those details I recommend you create a lazy evaluation proxy.
The idea here is that you internally store the find command and when you call toArray you get the collection and invoke the find command on it, then invoke toArray.
This means your getting a new collection every time and avoid the “is caching safe” problem but still have a nice API.