congo-model
Version:
A model class for the congo mongodb ecosystem
69 lines (59 loc) • 1.88 kB
JavaScript
var insert = require('congo-insert');
var update = require('congo-update');
var isObjectID = require('is-object-id');
var ObjectID = require('mongodb').ObjectID;
module.exports = function(db, collection_name, json_schema){
var modelClass = function(){
this.collection = db.collection(collection_name);
this.schema = json_schema;
this.data = {};
this.commited = false;
}
modelClass.prototype.save = function(callback){
var self = this;
if(this.commited){
update(this.collection, this.schema, this.data, function(err, result){
if(err == null)
self.commited = true;
callback(err, result);
});
}else
insert(this.collection, this.schema, this.data, callback);
};
modelClass.prototype.destroy = function(callback){
if(!this.commited)
this.collection.remove({_id: new ObjectID(this.data._id)}, callback);
else
callback("This model has not been saved, so it cannot be destroyed.", null);
};
modelClass.findRaw = function(query, callback){
var cursor = db.collection(collection_name).find(query);
callback(cursor);
};
modelClass.find = function(query, callback){
var documents = db.collection(collection_name).find(query).map(function(d){
var doc = new modelClass();
doc.data = d;
doc.commited = true;
return doc;
});
};
modelClass.findOne = function(query){
var cursor = db.collection(collection_name).find(query);
cursor.limit(1);
var results = cursor.toArray();
if(results.length > 0){
var doc = new modelClass();
doc.data = results[0];
doc.commited = true;
return doc;
}else return null;
};
modelClass.findOneByID = function(id){
if(!isObjectID(id))
return null;
else
return this.findOne({_id: new ObjectID(id)});
};
return modelClass;
};