mongoose入门(二)
2016-12-23 13:41
309 查看
http://www.html-js.com/article/1701
虽然模式(Schema)在MongoDB的存储中并不是必须的,但是一般来说为了文档的整齐一致我们在Mongoose中还是会用到模式。可以说,Mongoose中的一切都从定义模式开始。
使用过Mysql等关系数据库的同学一定对模式不陌生,简单来说,模式就是在数据之前先规定好了我们在表(MongoDB中没有表的概念,与之对应的是集合)中需要存储一些什么项目,每个项分别是什么类型。比如说我需要一张表(集合)来存储图书的信息,首先我要存储书名(name),它应该是一个字符串,然后是作者(author),也是字符串,还是售价(price),这个应该是一个数字类型。
使用Mongoose的第一步就是定义一个模式,我们来看看下面的代码:
在上面的代码中,我们定义了一个博客的模式。可以看到,定义一个模式其实就是对mongoose.Schema这个构造函数进行一个实例化,在实例化的同时需要给这个构造函数传递一个对象,这个对象中的每一个属性都是我们需要存储的字段名称,比如title,而与之对应的值则是这个字段的类型,比如说String。关于存储类型我们会在后面的文章中具体讲解。另外,在这个对象中可以发生对象、数组的嵌套。
模式并不真正和数据打交道,它好比一个成产饮料流水线上的模具,只负责给饮料瓶定型,而最后真正装饮料的是由模具生产出来的饮料瓶。在这里,模式就是模具,而饮料瓶则是模型。我们只有创建一个模型才能开始对数据进行操作。创建模型的方法很简单,只需要使用mongoose.model()方法即可:
mongoose.model()方法需要两个参数,第一个参数指明Model的名称,而第二个参数则是我们在前面定义的模式变量。一开始使用mongoose的同学可能会对这一行代码中出现的两个Blog感到疑惑,可以这样解释,mongoose.model()方法里面的这个Blog是用在mongoDB里面的,比如说在上面的这一行代码就会在mongoDB中生成一个叫做blogs的集合,注意两点:
1.在mongoDB中生成的这个集合名称为小写,也就是说无论mongoose.model()方法中的这个模型名称为大写还是小写,最终反映在mongoDB中均为小写
2.mongoDB中生成的这个集合名称会自动变为复数,例如,mongoose.model('Boy',mySchema)会生成一个叫做boys的集合,mongoose.model('Dependency',mySchema)会生成一个叫做dependencies的集合
而mongoose.model()方法外面的那个Blog则是用在JavaScript代码中的,我们以后对mongoDB数据进行操作需要通过这个Blog来完成。这两个名称完全可以随你的喜好来定义,一般情况下我们将它们定义为相同的名字只是为了在代码逐渐增多的情况下易于分辨。
如果说集合对应的是关系数据库中的表,那么文档对应的则是关系数据库中表的一行记录。我们在前面看到了模型是模式的实例,同样的文档也是模型的实例。我们可以通过下面的代码创建一个文档:
在这里我们通过对模型Name实例化生成了一个叫做jack的文档,并使用save方法将它存储到了集合names(还记得我们前面提到的吗?)中。
将模型初始化为一个文档之后,我们就可以使用文档方法。mongoose中的文档有很多内建的方法,比如我们上面代码中看到的save()方法,但是我们也可以很轻松的创建自定义的文档方法:
此时,所有由animalSchema实例化以后的模型生成的文档都具有了findSimilarTypes方法:
为模型添加一个静态方法也同样简单:
从上面的例子可以看到,文档方法是用在文档中的,而静态方法则是用在集合上的。
本站专栏文章皆为原创,转载请注明出处(带有 前端乱炖 字样)和本文的显式链接(http://www.html-js.com/article/1701),本站和作者保留随时要求删除文章的权利!
Mogoose入门(二)
模式
虽然模式(Schema)在MongoDB的存储中并不是必须的,但是一般来说为了文档的整齐一致我们在Mongoose中还是会用到模式。可以说,Mongoose中的一切都从定义模式开始。使用过Mysql等关系数据库的同学一定对模式不陌生,简单来说,模式就是在数据之前先规定好了我们在表(MongoDB中没有表的概念,与之对应的是集合)中需要存储一些什么项目,每个项分别是什么类型。比如说我需要一张表(集合)来存储图书的信息,首先我要存储书名(name),它应该是一个字符串,然后是作者(author),也是字符串,还是售价(price),这个应该是一个数字类型。
使用Mongoose的第一步就是定义一个模式,我们来看看下面的代码:
var mongoose = require('mongoose'); var Schema = mongoose.Schema; var blogSchema = 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 } });
在上面的代码中,我们定义了一个博客的模式。可以看到,定义一个模式其实就是对mongoose.Schema这个构造函数进行一个实例化,在实例化的同时需要给这个构造函数传递一个对象,这个对象中的每一个属性都是我们需要存储的字段名称,比如title,而与之对应的值则是这个字段的类型,比如说String。关于存储类型我们会在后面的文章中具体讲解。另外,在这个对象中可以发生对象、数组的嵌套。
创建一个模型
模式并不真正和数据打交道,它好比一个成产饮料流水线上的模具,只负责给饮料瓶定型,而最后真正装饮料的是由模具生产出来的饮料瓶。在这里,模式就是模具,而饮料瓶则是模型。我们只有创建一个模型才能开始对数据进行操作。创建模型的方法很简单,只需要使用mongoose.model()方法即可:var Blog = mongoose.model('Blog',blogSchema);
mongoose.model()方法需要两个参数,第一个参数指明Model的名称,而第二个参数则是我们在前面定义的模式变量。一开始使用mongoose的同学可能会对这一行代码中出现的两个Blog感到疑惑,可以这样解释,mongoose.model()方法里面的这个Blog是用在mongoDB里面的,比如说在上面的这一行代码就会在mongoDB中生成一个叫做blogs的集合,注意两点:
1.在mongoDB中生成的这个集合名称为小写,也就是说无论mongoose.model()方法中的这个模型名称为大写还是小写,最终反映在mongoDB中均为小写
2.mongoDB中生成的这个集合名称会自动变为复数,例如,mongoose.model('Boy',mySchema)会生成一个叫做boys的集合,mongoose.model('Dependency',mySchema)会生成一个叫做dependencies的集合
而mongoose.model()方法外面的那个Blog则是用在JavaScript代码中的,我们以后对mongoDB数据进行操作需要通过这个Blog来完成。这两个名称完全可以随你的喜好来定义,一般情况下我们将它们定义为相同的名字只是为了在代码逐渐增多的情况下易于分辨。
创建一个文档
如果说集合对应的是关系数据库中的表,那么文档对应的则是关系数据库中表的一行记录。我们在前面看到了模型是模式的实例,同样的文档也是模型的实例。我们可以通过下面的代码创建一个文档:var mySchema = new mongoose.Schema({name: String}); var Name = new mongoose.model('Name',mySchema); var jack = new Name({name: 'jack'}); var jack.save(function(err){ if(err) return console.error(err); console.log('save success'); })
在这里我们通过对模型Name实例化生成了一个叫做jack的文档,并使用save方法将它存储到了集合names(还记得我们前面提到的吗?)中。
文档方法
将模型初始化为一个文档之后,我们就可以使用文档方法。mongoose中的文档有很多内建的方法,比如我们上面代码中看到的save()方法,但是我们也可以很轻松的创建自定义的文档方法://首先定义一个模式 var animalSchema = new Schema({name: String, type: String}); //给模型的一个methods属性添加一个findSimilarTypes函数 animalSchema.methods.findSimilarTypes = function(cb){ return this.model('Animal').find({type: this.type},cb); }
此时,所有由animalSchema实例化以后的模型生成的文档都具有了findSimilarTypes方法:
var Animal = mongoose.model('Animal',animalSchema); var dog = new Animal({type: 'dog'}); dog.findSimilarTypes(function(err,dogs){ console.log(dogs); //woof });
静态方法
为模型添加一个静态方法也同样简单://为animalSchema的statics对象添加一个findByName函数 animalSchema.statics.findByname= function(name,cb){ this.find({name: new RegExp(name, 'i')},cb); } var Animal = mongoose.model('Animal',animalSchema); Animal.findByName('fido',function(err,animals){ console.log(animals); });
从上面的例子可以看到,文档方法是用在文档中的,而静态方法则是用在集合上的。
本文参考自mongoose文档,原文地址http://mongoosejs.com/docs/guide.html
如果你觉得本文对你有帮助请点击下面的链接为我提供赞助
本站专栏文章皆为原创,转载请注明出处(带有 前端乱炖 字样)和本文的显式链接(http://www.html-js.com/article/1701),本站和作者保留随时要求删除文章的权利!
相关文章推荐
- mongoose入门(一)
- Switching out callbacks with promises in Mongoose
- mongoose 多条件模糊查询的实现
- 【GoLang】golang 闭包 closure 参数传递的蹊跷!
- Django补充及初识Ajax
- Go学习之遇到的第一大坑
- django template 过滤器
- golang socket 例子
- 编译goldfish-3.10 内核
- day20 -Django一对一(多)以及Ajax
- django orm
- LeetCode Algorithms 1
- Google云盘更改本地同步目录的一种办法
- Django标准库:django.contrib
- 经典算法(2):黄金分割法(Gold)
- golang
- Go语言跨平台交叉编译
- Django Form 详解
- golang vim 插件设置
- Pycharm新建Django项目