使用mongoose操作mongoDB,全新底层

自带的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微信

扫码关注w3ctech微信公众号

共收到2条回复

  • 赞!

    回复此楼
  • @裕波 还得感谢你提醒我,多多学习

    回复此楼

AltStyle によって変換されたページ (->オリジナル) /