Mongoose在向集合中插入文档时的集合命名问题
Mongoose使用结构化的模式应用到MongoDB集合,为MongoDB Node.js原生驱动程序提供了更多的功能和简化了数据库操作。
从创建连接到向数据库中写入一个条数据经历了以下步骤:
1.连接数据库,并创建连接;
2.定义UserSchema(相当于数据库建表) ;
3.创建User模型(相当于构建对象和数据库表映射);
4.通过User模块,创建对象
5.通过save方法持久化对象;
(参考博客:Mongoose在创建Model时对Collection的命名策略http://www.tuicool.com/articles/R36bMbA)
如下代码就可以在数据库中创建一个 users ( 为什么是users是本文的重点 ) 集合并插入一条文档:
var mongoose = require('mongoose');
var schema = mongoose.Schema;
// 连接MongoDB
mongoose.connect("mongodb://localhost:27017");
// 定义模式
var userSchema = new schema({
name : String,
gender : String,
age : Number
});
// 编译模型
var User = mongoose.model('User', userSchema);
// 新建文档对象实例
var user1 = new User ({
name : "Jack",
gender : "male",
age : 23
});
// 将文档保存到数据库
user1.save(function(err, user1){
if(err){
return console.error(err);
}else{
console.info(user1);
}
});
分析一下上面的代码,有几个问题(坑)需要注意:
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, 说明上述的命名规则是正确的。
总结一下:

Mongoose在向集合中插入文档时的集合命名问题的更多相关文章
- MongoDB学习(操作集合中的文档)
文档概念 文档的数据结构和JSON基本一样. 所有存储在集合中的数据都是BSON格式. BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON. 插入文档 insert()方法 ...
- Mongodb(2)创建数据库,删除数据库,创建集合,删除集合,显示文档内容
显示所有数据库列表:show dbs > show dbs local .078GB runoob .078GB > 显示当前数据库:db > db runoob > 显示所有 ...
- MongoDB 插入文档
文档的数据结构和JSON基本一样. 所有存储在集合中的数据都是BSON格式. BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON. 插入文档 MongoDB 使用 inse ...
- MongoDB 教程(七):插入文档、更新文档、删除文档
MongoDB 插入文档 文档的数据结构和JSON基本一样. 所有存储在集合中的数据都是BSON格式 —— BSON是一种类json的二进制形式的存储格式,简称Binary JSON. MongoDB ...
- mongodb的基本操作与插入文档(document)
一.mongodb的基本操作: 1.查看mongodb当前所有的databases : show dbs 2.选择数据库(database) : use databaseName(该数据库不存在则会自 ...
- Mongodb(3)插入文档,更新文档,删除文档
insert() 方法 要插入数据到 MongoDB 集合,需要使用 MongoDB 的 insert() 或 save() 方法. 插入文档:db.COLLECTION_NAME.insert(d ...
- Python MongoDB 插入文档
章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...
- MongoDB插入文档
db.collection.insertOne() 插入单个文档.db.collection.insertMany() 插入多个文档.db.collection.insert() 插入单/多个文档. ...
- MongoDB快速入门(四)- 插入文档
插入文档 将数据插入到MongoDB集合,需要使用MongoDB 的 insert() 方法. 语法 insert()命令的基本语法如下: >db.COLLECTION_NAME.insert( ...
随机推荐
- POJ1155 TELE(树形DP)
题目是说给一棵树,叶子结点有负权,边有正权,问最多能选多少个叶子结点,使从叶子到根的权值和小于等于0. 考虑数据规模表示出状态:dp[u][k]表示在u结点为根的子树中选择k个叶子结点的最小权值 最后 ...
- HDU1667 : The Rotation Game
考虑枚举最后中间的数字,然后可以用一个24位的整数来表示一个状态,一共有C(24,8)=735471种状态,然后BFS即可. 比赛的时候由于手速问题没写完TAT 写完后在坑爹评测机上还是TLE. 所以 ...
- BZOJ3789 : 扫雪车
有上下界的网络流 T向S连容量为正无穷的边,将有源汇转化为无源汇 每条边容量减去下界,设in[i]表示流入i的下界之和减去流出i的下界之和 新建超级源汇SS,TT 对于in[i]>0的点,SS向 ...
- 【BZOJ】1221: [HNOI2001] 软件开发(最小费用最大流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1221 先吐槽一下,数组依旧开小了RE:在spfa中用了memset和<queue>的版本 ...
- MyEclipse设置注释格式(转载)
Window --> Java --> Code Style --> Code Templates --> Comments --> types --> Edit ...
- url上使用#号好不好
这是一篇摘自百度站长工具的文章. 一般来说,url当中的#号是一个锚点的标志位,这样的url打开之后会将访问者的视线定位在指定位置上,令访问者直接看到网页中间的一段内容.自从推特流行开始,#号被附予了 ...
- this.Page.Request.ServerVariables
服务器环境变量 指定要检索的服务器环境变量名.可以使用下面列出的值. 变量 说明 ALL_HTTP 客户端发送的所有 HTTP 标题文件. ALL_RAW 检索未处理表格中所有的标题.ALL_RAW ...
- 加载外部JavaScript的最佳方法
当<script>标记是一个HTML文档流,浏览器必须停止渲染并等待脚本文件下载并执行,然后再继续(例子).通过JavaScript创建一个新的<script>标签可以避免这个 ...
- MySQL 用户管理——权限表
权限表 权限表存放在mysql数据库中 user表结构 用户列:Host.User.Password 权限列:*priv 资源控制列:max* 安全列:其余 db表 存储了用户对某个数据库的操作权 ...
- Android--学习记录
最近天天被兔子激励,所以开始找工作,发现Android和iOS都会更有竞争力,所以就想学一下Android Android比iOS更开放,学习难度可能会更大,我已经做好了吃苦的准备 计划是三个月搞定, ...