首页 > 代码库 > mongoose 数据库操作2

mongoose 数据库操作2

 mongoose的内置的主要功能讲解


除了定义文档结构和你要存储的数据类型外,模式(Schema)还用于以下定义:

·        Validators(异步和同步)

·        Defaults -默认值

·        Getters

·        Setters

·        Indexes -索引

·        Middleware -中间件

·        Methods definition -方法定义

·        Statics definition -静态定义

·        Plugins -插件

Aside from defining thestructure of your documents and the types of data you‘re storing, a Schemahandles the definition of:

·        Validators (async andsync)

·        Defaults

·        Getters

·        Setters

·        Indexes

·        Middleware

·        Methods definition

·        Statics definition

·        Plugins

·        pseudo-JOINs

 

(1)验证器

验证器通过ShcemaType定义

内部使用中间件

默认在使用save操作时自动开启(create操作应该是不管用的,这个我们可以试一试)

使用异步操作

验证器可以自定义

 

 

定义验证通过,path(“属性”).validate(function(value){})来定义,我们看看例子:

<pre name="code" class="javascript">

var toySchema = newSchema({

  color: String,

  name: String

});

 

var Toy = mongoose.model(‘Toy‘, toySchema);

 

Toy.schema.path(‘color‘).validate(function (value) {

  return /blue|green|white|red|orange|periwinkle/i.test(value);

}, ‘Invalid color‘);

 

var toy = newToy({ color:‘grease‘});

 

toy.save(function (err) {

  // err is ourValidationError object

  // err.errors.coloris a ValidatorError object

 

 console.log(err.errors.color.message)// prints‘Validator "Invalid color" failed for path color with value `grease`‘

 console.log(String(err.errors.color))// prints‘Validator "Invalid color" failed for path color with value `grease`‘

 console.log(err.errors.color.type) // prints "Invalid color"

 console.log(err.errors.color.path) // prints "color"

 console.log(err.errors.color.value)// prints"grease"

  console.log(err.name) // prints"ValidationError"

  console.log(err.message) // prints"Validation failed"

});

</pre>

 

上面的例子很简单嘛,

如果用不到验证的方法那么,直接create 就可以

Toy.create({xx:xxx},function(err,schema){});

 

(2)默认值

 

上例子:

<pre name="code" class="javascript">

var schema =new Schema({ n: { type: Number, default: 10 })

var M = db.model(‘M‘, schema)

var m = new M;

console.log(m.n) // 10

</pre>

 

在方案(Schema)设置defualt值后,值初始化模型后就可以直接获取这个值,那么我们在插入操作中要如何去做呢?

<pre name="code" class="javascript">

var db = require(‘mongoose‘)

,Schema = db.Schema;

var schema = new Schema({ n: { type: Number, default: 10 }});

db.connect(‘mongodb://localhost:8888/toy‘, function (err) {

    var Toy = db.model(‘Toy‘, schema,"toy");

    new Toy({}).save(function(err){

        if(err)return console.log(err);

        console.log("报错成功");

    });

    if (err) throw err;

});

</pre>

这个例子中关键的地方在于new Toy({}) 并没有写n这个对象,那么我们来查一下数据库看一下输出:

<pre name="code" class="javascript">

> db.toy.find()

{ "_id" : ObjectId("5361a5fa62c7cc803624ec0d"),"n" : 10, "__v" : 0 }

</pre>

 

 

(3)给模型添加一个静态的方法:

<pre name="code" class="javascript">

// assign afunction to the "statics" object of our animalSchema

animalSchema.statics.findByName = function (name, cb) {

  this.find({ name:newRegExp(name, ‘i‘) }, cb);

}

 

var Animal = mongoose.model(‘Animal‘,animalSchema);

Animal.findByName(‘fido‘,function (err, animals) {

  console.log(animals);

});

</pre>

 

(4)创建索引:

 

在mongodb数据库中索引排序1 和 -1 代表正反

<pre name="code" class="javascript">

 

var animalSchema= new Schema({

  name: String,

  type: String,

  tags: { type: [String], index: true } // field level

});

 

animalSchema.index({ name: 1, type: -1 }); // schema level

</pre>

 

(5)插件就是mongoose提供的一个可以模块化的一个功能,可以把面的一些零散的功能写到一个插件中组合起来,比如set get 方法中间件等写到一个模块中:

 

<pre name="code" class="javascript">

 

// lastMod.js

module.exports = exports =functionlastModifiedPlugin (schema, options){

  schema.add({ lastMod: Date })

 

  schema.pre(‘save‘,function (next) {

    this.lastMod = new Date

    next()

  })

 

  if(options && options.index) {

    schema.path(‘lastMod‘).index(options.index)

  }

}

 

// game-schema.js

var lastMod= require(‘./lastMod‘);

varGame = new Schema({ ... });

Game.plugin(lastMod, {index: true });

 

// player-schema.js

varlastMod = require(‘./lastMod‘);

varPlayer = new Schema({ ... });

Player.plugin(lastMod);

</pre>