Schema

  Schema主要用于定义MongoDB中集合Collection里文档document的结构  

  定义Schema非常简单,指定字段名和类型即可,支持的类型包括以下8种

复制代码



String 字符串

Number 数字

Date 日期

Buffer 二进制

Boolean 布尔值

Mixed 混合类型

ObjectId 对象ID

Array 数组

复制代码

  通过mongoose.Schema来调用Schema,然后使用new方法来创建schema对象

复制代码



var mongoose = require('mongoose');

var Schema = mongoose.Schema;



var mySchema = new Schema({

title: String,

author: String,

body: String,

comments: [{ body: String, date: Date }],

date: { type: Date, default: Date.now },

hidden: Boolean,

meta: {

votes: Number,

favs: Number

}

});

复制代码

  [注意]创建Schema对象时,声明字段类型有两种方法,一种是首字母大写的字段类型,另一种是引号包含的小写字段类型



var mySchema = new Schema({title:String, author:String});

//或者

var mySchema = new Schema({title:'string', author:'string'});

  如果需要在Schema定义后添加其他字段,可以使用add()方法



var MySchema = new Schema;

MySchema.add({ name: 'string', color: 'string', price: 'number' });
 

  

Model

  模型Model是根据Schema编译出的构造器,或者称为类,通过Model可以实例化出文档对象document

  文档document的创建和检索都需要通过模型Model来处理

【model()】

mongoose.model()
 

  使用model()方法,将Schema编译为Model。model()方法的第一个参数是模型名称

  [注意]一定要将model()方法的第一个参数和其返回值设置为相同的值,否则会出现不可预知的结果

  Mongoose会将集合名称设置为模型名称的小写版。如果名称的最后一个字符是字母,则会变成复数;如果名称的最后一个字符是数字,则不变;如果模型名称为"MyModel",则集合名称为"mymodels";如果模型名称为"Model1",则集合名称为"model1"



var schema = new mongoose.Schema({ num:Number, name: String, size: String});

var MyModel = mongoose.model('MyModel', schema);

【实例化文档document】

  通过对原型Model1使用new方法,实例化出文档document对象

复制代码



var mongoose = require('mongoose');

mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {

if(err){

console.log('连接失败');

}else{

console.log('连接成功');

var schema = new mongoose.Schema({ num:Number, name: String, size: String});

var MyModel = mongoose.model('MyModel', schema);

var doc1 = new MyModel({ size: 'small' });

console.log(doc1.size);//'small'

}

});
 

复制代码

【文档保存】

  通过new Model1()创建的文档doc1,必须通过save()方法,才能将创建的文档保存到数据库的集合中,集合名称为模型名称的小写复数版

  回调函数是可选项,第一个参数为err,第二个参数为保存的文档对象

save(function (err, doc) {})
 

复制代码



var mongoose = require('mongoose');

mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {

if(!err){

var schema = new mongoose.Schema({ num:Number, name: String, size: String });

var MyModel = mongoose.model('MyModel', schema);

var doc1 = new MyModel({ size: 'small' });

doc1.save(function (err,doc) {

//{ __v: 0, size: 'small', _id: 5970daba61162662b45a24a1 }

console.log(doc);

})

}

});

复制代码

  由下图所示,db1数据库中的集合名称为mymodels,里面有一个{size:"small"}的文档

 

自定义方法

【实例方法】

  Model的实例是document,内置实例方法有很多,如 save,可以通过Schema对象的methods属性给实例自定义扩展方法

复制代码



var mongoose = require('mongoose');

mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {

if(!err){

var schema = new mongoose.Schema({ num:Number, name: String, size: String });

schema.methods.findSimilarSizes = function(cb){

return this.model('MyModel').find({size:this.size},cb);

}

var MyModel = mongoose.model('MyModel', schema);

var doc1 = new MyModel({ name:'doc1', size: 'small' });

var doc2 = new MyModel({ name:'doc2', size: 'small' });

var doc3 = new MyModel({ name:'doc3', size: 'big' });

doc1.save();

doc2.save();

doc3.save();

setTimeout(function(){

doc1.findSimilarSizes(function(err,docs){

docs.forEach(function(item,index,arr){

//doc1

//doc2

console.log(item.name)

})

})

},0)

}

});

复制代码

【静态方法】

  通过Schema对象的statics属性给 Model 添加静态方法

复制代码



var mongoose = require('mongoose');

mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {

if(!err){

var schema = new mongoose.Schema({ num:Number, name: String, size: String });

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

return this.find({name: new RegExp(name,'i')},cb);

}

var MyModel = mongoose.model('MyModel', schema);

var doc1 = new MyModel({ name:'doc1', size: 'small' });

var doc2 = new MyModel({ name:'doc2', size: 'small' });

var doc3 = new MyModel({ name:'doc3', size: 'big' });

doc1.save();

doc2.save();

doc3.save();

setTimeout(function(){

MyModel.findByName('doc1',function(err,docs){

//[ { _id: 5971e68f4f4216605880dca2,name: 'doc1',size: 'small',__v: 0 } ]

console.log(docs);

})

},0)

}

});
 

复制代码

  由上所示,实例方法和静态方法的区别在于,静态方法是通过Schema对象的statics属性model添加方法,实例方法是通过Schema对象的methods是给document添加方法

【查询方法】

  通过schema对象的query属性,给model添加查询方法

复制代码



var mongoose = require('mongoose');

mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {

if(!err){

var schema = new mongoose.Schema({ age:Number, name: String});

schema.query.byName = function(name){

return this.find({name: new RegExp(name)});

}

var temp = mongoose.model('temp', schema);

temp.find().byName('huo').exec(function(err,docs){

//[ { _id: 5971f93be6f98ec60e3dc86c, name: 'huochai', age: 27 },

// { _id: 5971f93be6f98ec60e3dc86e, name: 'huo', age: 30 } ]

console.log(docs);

})



}

});

复制代码

 

文档新增

  文档新增有三种方法,一种是使用上面介绍过的文档的save()方法,另一种是使用模型model的create()方法,最后一种是模型model的insertMany()方法

【save()】

  [注意]回调函数可以省略

save([options], [options.safe], [options.validateBeforeSave], [fn])
 

  新建{age:10,name:'save'}文档,并保存

复制代码



var mongoose = require('mongoose');

mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {

if(!err){

var schema = new mongoose.Schema({ age:Number, name: String});

var temp = mongoose.model('temp', schema);

//使用链式写法

new temp({age:10,name:'save'}).save(function(err,doc){

//[ { _id: 59720bc0d2b1125cbcd60b3f, age: 10, name: 'save', __v: 0 } ]

console.log(doc);

});

}

});

复制代码

【create()】

  使用save()方法,需要先实例化为文档,再使用save()方法保存文档。而create()方法,则直接在模型Model上操作,并且可以同时新增多个文档

Model.create(doc(s), [callback])
 

  新增{name:"xiaowang"},{name:"xiaoli"}这两个文档

复制代码



var mongoose = require('mongoose');

mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {

if(!err){

var schema = new mongoose.Schema({ age:Number, name: String});

var temp = mongoose.model('temp', schema);

temp.create({name:"xiaowang"},{name:"xiaoli"},function(err,doc1,doc2){

//{ __v: 0, name: 'xiaowang', _id: 59720d83ad8a953f5cd04664 }

console.log(doc1);

//{ __v: 0, name: 'xiaoli', _id: 59720d83ad8a953f5cd04665 }

console.log(doc2);

});

}

});

复制代码

【insertMany()】

Model.insertMany(doc(s), [options], [callback])
 

  新增{name:"a"},{name:"b"}这两个文档

复制代码



var mongoose = require('mongoose');

mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {

if(!err){

var schema = new mongoose.Schema({ age:Number, name: String});

var temp = mongoose.model('temp', schema);

temp.insertMany([{name:"a"},{name:"b"}],function(err,docs){

//[ { __v: 0, name: 'a', _id: 59720ea1bbf5792af824b30c },

//{ __v: 0, name: 'b', _id: 59720ea1bbf5792af824b30d } ]

console.log(docs);

});



}

});

 

 

学完还想练?点这里!