reviews-analysis
Version:
Analyse public vehicle reviews via ML (Aylien) and save the data into a Document Store (Mongo). Supports Classifications and Document and Aspect level Sentiment Analysis.
140 lines (121 loc) • 3.53 kB
JavaScript
var mongo = require('mongodb');
/**
* Default connection details.
*/
var defaults = {
host: '127.0.0.1'
, port: 27017
, database: 'default'
};
/**
* Create a MongoDB database connection.
*
* @param {Object|String} config (optional)
* @param {Object} options (optional)
* @api public
*/
var Database = exports.Database = function (config, options) {
var database, host, port, self = this;
config = config || {};
options = options || {
auto_reconnect: true
, poolSize: 8
};
if (config.mongodb) {
config = config.mongodb;
}
if (typeof config === 'object') {
host = config.host || defaults.host;
port = config.port || defaults.port;
database = config.database || defaults.database;
} else {
//Parse (host)(:port)(/database)
var match = config.match(/([^:\/]+)?(\:[0-9]+)?(\/.+)?/);
host = match[1] || defaults.host;
port = match[2] ? parseInt(match[2].substr(1), 10) : defaults.port;
database = match[3] ? match[3].substr(1) : defaults.database;
}
this.db = new mongo.Db(database, new mongo.Server(host, port, options || {}));
};
/**
* Get a MongoDB collection.
*
* @return {Collection} collection
* @api public
*/
Database.prototype.collection = function (name) {
return new Collection(this.db, name);
};
/**
* A MongoDB collection.
*
* @param {Mongodb.Database} db
* @param {String} name
* @api public
*/
var Collection = exports.Collection = function (db, name) {
this.db = db;
this.name = name;
};
/**
* Proxy calls to the underlying collection so that they're buffered
* until a connection is made.
*/
Object.keys(mongo.Collection.prototype).forEach(function (method) {
Collection.prototype[method] = function () {
var args = Array.prototype.slice.call(arguments)
, callback = args[args.length - 1]
, db = this.db, name = this.name;
db.open(function (err) {
if (err) return callback(err);
db.collection(name, function (err, collection) {
if (err) return callback(err);
collection[method].apply(collection, args);
});
});
};
});
/**
* Provide a helper for finding documents but managing concurrency while
* iterating over the cursor.
*
* @param {Object} query (optional)
* @param {Number} concurrent - how many calls to callback before requiring next()
* @param {Function} callback - receives (err, doc, next)
* @api public
*/
Collection.prototype.concurrent = function (query, concurrent, callback) {
if (arguments.length === 2) {
callback = concurrent;
concurrent = query;
query = {};
}
this.find(query, function (err, cursor) {
if (err) return callback(err);
var complete;
function next() {
cursor.nextObject(function (err, obj) {
if (complete) {
return;
} else if (err) {
complete = true;
return callback(err);
}
callback(null, obj, function () {
process.nextTick(next);
});
});
}
while (concurrent--) next();
});
};
/**
* Convenience method for creating a connection.
*
* @param {Object|String} config
* @return {Database} connection
* @api public
*/
exports.connect = function (config, options) {
return new Database(config, options);
};