自带的mongoModel研究了好久还是不好使,只是个半成品,现在结合了原来的mongoModel自己写了一个结合mongooose的model,方法如下: 新增\node_modules\thinkjs\lib\Lib\Extend\Model\MongooseModel.js
'use strict';
var mongoose = thinkRequire('mongoose');
/**
* mongodb model
* @type {[type]}
**/
module.exports = Class({
/**
* 模型名
* @type {String}
*/
name: '',
/**
* 连接mongodb句柄
* @type {[type]}
*/
db: null,
/**
* 字段列表
* @type {Object}
*/
fields: {},
/**
* 选项列表
* @type {Object}
*/
schema_options: {},
/**
* 操作选项
* @type {Object}
*/
_options: {},
/**
* 初始化
* @return {[type]} [description]
*/
init: function(config){
this.config = extend({
db_host: C('db_host'),
db_port: C('db_port'),
db_name: C('db_name')
}, config || {});
},
/**
* 初始化db
* @return {[type]} [description]
*/
initDb: function(){
if (this.db) {
return this.db;
}
var db_user = C('db_user'),db_pwd=C('db_pwd'),db_host=C('db_host'),db_port=C('db_port'),db_name=C('db_name');
this.db = mongoose.createConnection('mongodb://'+db_user+':'+db_pwd+'@'+db_host+':'+db_port+'/'+db_name);
return this.db;
},
schema : function(){
return new mongoose.Schema(this.fields, this.schema_options);
},
/**
* 获取model
* @return {[type]} [description]
*/
model : function(){
var modelName = this.getModelName().toLowerCase();//鄙人看不惯大写的集合名
return this.initDb().model(modelName, this.schema(), nodelName);
},
/**
* 获取模型名
* @access public
* @return string
*/
getModelName: function(){
if (this.name) {
return this.name;
}
var filename = this.__filename || __filename;
var last = filename.lastIndexOf('/');
this.name = filename.substr(last + 1, filename.length - last - 9);
return this.name;
},
//部分函数需要覆盖定义,以免与自带函数冲突
find: function(data){
return this.model().find(data);
},
save : function(data){
//return this.model().create(data);
var model = this.model();
var nmodel = new model(data);
var deferred = getDefer();
nmodel.save(function(err){
if (err) {
deferred.reject(err);
}else{
deferred.resolve();
}
})
return deferred.promise;
},
create : function(data){
var deferred = getDefer();
this.model().create(data, function(err, result){
if(err){
deferred.reject(err);
}else{
deferred.resolve(result);
}
});
return deferred.promise;
},
update : function(conditions, update, options){
var options = options || {multi : true, upsert : true}; //fedault update all
var deferred = getDefer();
this.model().update(conditions, update, options, function(err){
if(err){
deferred.reject(err);
}else{
deferred.resolve();
}
});
return deferred.promise;
}
})
model里需要继承mongooseModel,controller里可以直接像thinkPHP那样操作了
干脆直接上demo
新增App\Lib\Model\UserModel.js
module.exports = Model('MongooseModel', {
fields: {
username : {type : String, default : 'defaul name'},
age : {type :Number, default : 20},
addTime : {type :String, default :Math.round((new Date()).getTime()/1000)}
}
})
修改\App\Lib\Controller\Home\IndexController.js
module.exports = Controller("Home/BaseController", function() {
"use strict";
return {
indexAction: function() {
var self = this;
//find find
// D('User').find().exec(function(err1,data1){
// D('User').find().exec(function(err2,data2){
// self.end({'dataOne':data1, 'dataTwo':data2});
// });
// });
//find query
// D('User')
// .find()
// .where('username').equals('new name')
// .where('age').gt(17).lt(22)
// .limit(20)
// .sort('-addTime')
// .select('username addTime')
// .exec(function(err,data){
// self.end(data);
// });
//save create //save one create multi callbakc = adddata
// var createdata = [{username:'jfire',age:19},{username:'xfire',age:25}];
// var savedata = {username:'save one name',age:22};
// D('User').save(savedata).then(function(data1){
// D('User').find().sort('-addTime').exec(function(err,data2){
// var result = {'add':data1,'find':data2}
// self.end(result);
// });
// });
//find limit
// D('User').find().limit(6).select('username').exec(function(err, data){
// self.end(data);
// });
//remove where
// D('User').find().where({username:'new name'}).remove().exec(function(err,data){
// self.end(data);
// });
//update callback = err
// D('User').update({'username':'xfire'},{'username':'new name'}).then(function(err){
// if(err){
// self.end({'msg':'update failed'});
// }else{
// D('User').find().exec(function(err,data2){
// self.end({'data1':'update OK!','data2':data2});
// });
// }
// });
}
};
});
扫码关注w3ctech微信公众号
赞!
@裕波 还得感谢你提醒我,多多学习
共收到2条回复