mongoose基本用法

什么是Mongoose

Mongoose库简而言之就是对node环境中MongoDB数据库操作的封装,一种对象模型工具,可以将数据库中的数据转换为JavaScript对象供我们使用。

模式、模型

Schema(模式)

一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力,仅仅只是一段代码,无法通往数据库端, 仅仅只是数据库模型在程序片段中的一种表现

var BlogSchema = new Schema({
  title:String,
  author:String
});
  • Schema.Type

    Schema.Type是由Mongoose内定的一些数据类型,基本数据类型都在其中,Mongoose也内置了一些特有的Schema.Type

      var ExampleSchema = new Schema({
        name:String,
        binary:Buffer,
        living:Boolean,
        updated:Date,
        age:Number,
        mixed:Schema.Types.Mixed, //该混合类型等同于nested
        _id:Schema.Types.ObjectId,  //主键
        _fk:Schema.Types.ObjectId,  //外键
        array:[],
        arrOfString:[String],
        arrOfNumber:[Number],
        arrOfDate:[Date],
        arrOfBuffer:[Buffer],
        arrOfBoolean:[Boolean],
        arrOfMixed:[Schema.Types.Mixed],
        arrOfObjectId:[Schema.Types.ObjectId]
      });
    

Model(模型)

Model模型,是经过Schema构造来的,是Schema的编译版本。一个model的实例直接映射为数据库中的一个文档。基于这种关系, 以后的增删改查(CURD)都要通过这个Model实现。

//先创建Schema
var UserSchema = new Schema({
  name:'String',
  sex:'String' 
});
//通过Schema创建Model
var UserModel = mongoose.model('User',UserSchema );

查询

直接查询

PersonModel.findOne({'name.last':'dragon'},function(err,person){});

链式查询

这种方式相对直接查询,分的比较明细,如果不带callback,则返回query,该query对象执行的方法都将返回自己,只有在执行exec方法时才执行查询,而且必须有回调。

Person
  .find({ occupation: /host/ })
  .where('name.last').equals('Ghost')
  .where('age').gt(17).lt(66)
  .where('likes').in(['vaporizing', 'talking'])
  .limit(10)
  .sort('-occupation')
  .select('name occupation')
  .exec(callback);

验证Validation

数据的存储是需要验证的,不是什么数据都能往数据库里丢或者显示到客户端的,如果验证失败,则会返回err。

1.required 非空验证

2.min/max 范围验证(边值验证)

3.enum/match 枚举验证/匹配验证

4.validate 自定义验证规则

var PersonSchema = new Schema({
  name:{
    type:'String',
    required:true //姓名非空
  },
  age:{
    type:'Nunmer',
    min:18,       //年龄最小18
    max:120     //年龄最大120
  },
  city:{
    type:'String',
    enum:['北京','上海']  //只能是北京、上海人
  },
  other:{
    type:'String',
    validate:[validator,err]  //validator是一个验证函数,err是验证失败的错误信息
  }
});

使用初步

安装文件

npm install mongoose --save

引入依赖

var mongoose = require("mongoose")
mongoose.connect('mongodb://localhost/testDataBase');

定义schema

这里我们定义一个userSchema.js文件

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var UserSchema = new Schema({
  uid: {
      type: String,
    required: true, 
    unique: true
  },
  logLevel: {
    type: String,
    default: 'info'
  },
  meta: {
    createAt: {
      type: Date,
      default: Date.now()
    },
    updateAt: {
      type: Date,
      default: Date.now()
    }
  }
});

UserSchema.pre('save', function (next) {
  if (this.isNew) {
    this.meta.updateAt = this.meta.createAt = Date.now();
  } else {
    this.meta.updateAt = Date.now();
  }
  next()
});

UserSchema.statics = {
  fetch: function (cb) {
    return this.find({})
      .sort('meta.createAt')
      .exec(cb)
  },
  findById: function (id, cb) {
    return this.findOne({_id: id})
      .sort('meta.createAt')
      .exec(cb);
  },
  findByUid: function (uid, cb) {
    return this.findOne({uid: uid})
      .sort('meta.createAt')
      .exec(cb);
  }
};

module.exports = UserSchema;

将schema发布为Model

这里我们定义一个userModule.js文件。用于引用schema,发布为model,向外导出。

var mongoose = require('mongoose');
var UserSchema = require('./userSchema');

var User = mongoose.model('User',UserSchema);

module.exports = User;

增删改查

在controller层引入这个model,就可以使用之前定义的静态方法了。这个model还拥有Model.create(),Model.find(),Model.update(),Model.remove()方法,进行基本的CURD操作。下面举个简单的例子,实现增删改查功能。

var _ = require('underscore');
var User = require('../models/user');

module.exports = {
  //  通过实例化model,创建一个model实例
  add: function(req, res, next) {

    var _user = new User(req.body.user);//相当于调用了Model.create(req.body)
    _user.save(function (err, user) {
      if (err) {
        //doSomething...
      } else {
        //doSomething...
      }
    })
  },

  delete: function (req, res) {
    var id = req.query._id;
  
    User.remove({_id: id}, function (err) {
      if (err) {
        //doSomething...
      } else {
        //doSomething...
      }
    })
  },
  update: function (req, res) {
   
    var id = req.body.id;
    var userParams = req.body;

    User.findById(id, function (err, user) {
      if (err) {
        //doSomething...
      } else {
        _user = _.extend(user, userParams);
        _user.save(function (err, user) {
          if(err) {
            //doSomething...
          } else {
            //doSomething...
          }
        })
      }
    })
  },
  list: function (req, res) {
    User.fetch(function (err, users) {
      var resultUsers=_.map(users, function(user){
      if (err){
        //doSomething...
      } else {
        //doSomething...
      }
    })
  },
};

结尾

本篇文章介绍了mongoose的基本概念和使用事例,下篇文章中,会继续探讨schema的几种方法,使用promise方式代替回调调用、population的使用等进阶用法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容