Mongoose在向集合中插入文档时的集合命名问题

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, 说明上述的命名规则是正确的。

 

总结一下: 

相关文章
相关标签/搜索