Mongoose使用结构化的模式应用到MongoDB集合,为MongoDB Node.js原生驱动程序提供了更多的功能和简化了数据库操做。mongodb
从建立链接到向数据库中写入一个条数据经历了如下步骤:数据库
1.链接数据库,并建立链接;mongoose
2.定义UserSchema(至关于数据库建表) ;ui
3.建立User模型(至关于构建对象和数据库表映射);spa
4.经过User模块,建立对象code
5.经过save方法持久化对象;对象
(参考博客:Mongoose在建立Model时对Collection的命名策略http://www.tuicool.com/articles/R36bMbA)blog
以下代码就能够在数据库中建立一个 users ( 为何是users是本文的重点 ) 集合并插入一条文档:ip
1 var mongoose = require('mongoose'); 2 var schema = mongoose.Schema; 3 4 // 链接MongoDB 5 mongoose.connect("mongodb://localhost:27017"); 6 7 // 定义模式 8 var userSchema = new schema({ 9 name : String, 10 gender : String, 11 age : Number 12 }); 13 14 // 编译模型 15 var User = mongoose.model('User', userSchema); 16 17 // 新建文档对象实例 18 var user1 = new User ({ 19 name : "Jack", 20 gender : "male", 21 age : 23 22 }); 23 24 // 将文档保存到数据库 25 user1.save(function(err, user1){ 26 if(err){ 27 return console.error(err); 28 }else{ 29 console.info(user1); 30 } 31 });
分析一下上面的代码,有几个问题(坑)须要注意:ci
1.链接数据库没有指定数据库。
Mongoose链接数据库建议的写法为:
mongoose.connect("mongodb://localhsot:port/databaseName");
即在链接时指定localhost上的数据库,若是没有显式地指定,则默认链接到 MongoDB的 test 数据库,这一点要注意。
2.定义模式或编译模型时没有指定集合。
定义模式的语法是: new Schema( [defination], [options] )
其中defination即文档中属性的定义,options为可指定的选项,包括autoIndex、collection、id、_id、strict等。
通常在定义模式的时候直接指定collection,即须要建立模式的集合名称,若是不指定,能够在编译模型的时候进行指定。
3.编译模型时没有指定集合。
编译模型: model(name, [schema], [colleciton], [skipInit] )
参数: name :标识model的字符串
schema: 即前面定义的Schema对象
collection:要链接的集合名称(若是在Schema对象中没有指定一个集合)
skipInit: 默认为false,若是为true,则跳过初始化过程,建立一个没有链接到数据库的一个简单的Model对象。
* 分析上面的代码,发如今Schema中没有指定集合,而在模型的定义中也没有指定集合,那么新建的文档将要插入到哪里呢?
在MongoDB中,若是向一个不存在的集合中插入文档,则对应的数据库(默认为test)会建立一个集合,二Mongoose一样遵循这个原则,
而且在新建立的数据库的命名上面也很有讲究,
判断模型名是否可数,若是不可数直接返回模型名做为新集合的名称;若是可数,则返回模型名的复数形式做为新集合的名称(模型名+'s') ;
为了验证上述规则,运行上述的代码,并查看 test 数据库中的集合,以下:
经过查询集合中的文档能够发现,新建立的集合名称为 users 。
尝试修改模型名称为不可数,好比Fish, 再次运行代码,查看新建的集合名称:
能够发现,此时的集合名称是fish, 说明上述的命名规则是正确的。
总结一下: