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

本文介绍了Mongoose在Node.js环境中如何与MongoDB交互并自动创建集合的过程。重点讲解了未明确指定集合名称时,Mongoose如何根据模型名称确定集合名称的规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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是本文的重点 ) 集合并插入一条文档:

 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 });

分析一下上面的代码,有几个问题(坑)需要注意:

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

 

总结一下: 

 

转载于:https://www.cnblogs.com/wx1993/p/5243245.html

嵌套文档模式在Mongoose中允许开发者在单个文档中存储复杂的数据结构。同Mongoose的population功能支持跨集合的联表查询,使得数据关联变得更加简单和直观。具体操作如下: 参考资源链接:[MongoDB框架Mongoose中文指南](https://wenku.youkuaiyun.com/doc/1byup7o8rc?spm=1055.2569.3001.10343) - **定义嵌套文档模式**:首先,我们需要定义包含嵌套文档的模式。在Mongoose中,嵌套文档是通过数组或对象在模式中声明的。例如,假设我们需要一个用户模式,其中包含嵌套的地址信息。 ```javascript const userSchema = new mongoose.Schema({ name: String, email: String, addresses: [{ street: String, city: String, zipCode: String }] }); ``` - **创建模型**:模式定义后,需要将其编译成一个模型,以便可以创建和操作文档。 ```javascript const User = mongoose.model('User', userSchema); ``` - **插入数据**:使用模型插入包含嵌套文档的用户数据。 ```javascript const user = new User({ name: 'John Doe', email: '***', addresses: [{ street: '123 Main St', city: 'Anytown', zipCode: '12345' }] }); user.save(); ``` - **联表查询**:Mongoose的population允许你通过引用将文档关联起来。例如,如果我们还有一个地址模型Address,我们可以在用户查询填充地址信息。 ```javascript User.findById('user-id') .populate('addresses') .exec((err, user) => { if (err) { return console.error(err); } console.log(user.addresses); }); ``` 在上述示例中,我们首先定义了一个包含嵌套地址信息的用户模式,然后创建了一个用户文档,并通过调用populate方法实现了跨集合的联表查询,将用户文档中引用的地址信息填充到查询结果中。这样,开发者就可以在应用中处理复杂的数据关系,同保持代码的清晰和维护性。 通过以上步骤,你可以实现嵌套文档的模式定义和跨集合的联表查询。为了进一步掌握这些概念和技巧,建议详细阅读《MongoDB框架Mongoose中文指南》。这份资源不仅提供了详细的操作指南,还包含了丰富的实例和最佳实践,帮助你更好地在实际开发中运用Mongoose功能。 参考资源链接:[MongoDB框架Mongoose中文指南](https://wenku.youkuaiyun.com/doc/1byup7o8rc?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值