w3ctech

使用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条回复

  • 赞!

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

    回复此楼