使用mongoose过程中遇到的疑惑(Nodejs版,已经解决)

使用mongoose过程中遇到的疑惑(Nodejs版,已经解决)

在运行node_club项目过程中,一直很好奇新注册的用户是如何插入mongodb数据库中的。查看源码发现原来是通过mongoose来与mongodb进行操作的。而mongoose是通过model来创建mongodb中对应的collection的,这样你通过如下的代码:

mongoose.model('User', UserSchema);

在相应的数据库中创建一个collection时,第一反应肯定会推断在对应的数据库中会建立一个‘User’的collection,但是事实却与推断完全不一样,这也是一直困扰我两的问题,我通过在mongodb的命令行中试图去寻找我刚新建的collection,代码如下:

use node_club show collections //只能看到有一个名为users的collection,而没有User的collection

由此我们可以推断mongoose在内部创建collection时将我们传递的collection名小写化,同时如果小写化的名称后面没有字母——s,则会在其后面添加一s,针对我们刚建的collection,则会命名为:users。

希望这能给打算研究node_club项目的同学们带来点帮助!

12 回复

使用mongoose过程中遇到的疑惑(Nodejs版,已经解决)

在运行 node_club 项目过程中,我一直很好奇新注册的用户是如何插入到 MongoDB 数据库中的。查看源码后发现,原来这一切都是通过 Mongoose 来完成的。Mongoose 是一个用于 Node.js 的对象数据映射(ODM)工具,它使得与 MongoDB 进行交互变得更加简单。

创建 Model

Mongoose 通过 Model 来创建 MongoDB 中对应的 Collection。以下是一个简单的例子:

const mongoose = require('mongoose');

// 定义 Schema
const UserSchema = new mongoose.Schema({
    username: { type: String, required: true },
    password: { type: String, required: true },
    email: { type: String, required: true }
});

// 创建 Model
const User = mongoose.model('User', UserSchema);

module.exports = User;

在这段代码中,我们定义了一个 UserSchema,然后通过 mongoose.model 方法创建了一个名为 User 的 Model。

插入数据

接下来,我们可以在控制器或服务层中使用这个 Model 来插入数据:

const User = require('./models/User'); // 假设模型文件路径为 models/User.js

async function registerNewUser(username, password, email) {
    try {
        const newUser = new User({
            username,
            password,
            email
        });
        
        await newUser.save();
        console.log('User registered successfully!');
    } catch (error) {
        console.error('Error registering user:', error);
    }
}

在这个例子中,我们创建了一个新的 User 实例,并调用 save() 方法将其保存到数据库中。

关于 Collection 名称

你可能会注意到,尽管你在 mongoose.model 中指定的是 User,但在 MongoDB 中实际创建的 Collection 名称却是 users。这是由于 Mongoose 的命名约定导致的:

  • 如果你在创建 Model 时指定了大写的名称(如 User),Mongoose 会自动将其转换为复数形式(如 users)。
  • 如果你想自定义 Collection 名称,可以在定义 Model 时明确指定:
const User = mongoose.model('User', UserSchema, 'custom_users');

这样,Mongoose 就会在 MongoDB 中创建一个名为 custom_users 的 Collection 而不是默认的 users

总结

通过上述示例,你应该能够理解如何使用 Mongoose 来创建 Model 并插入数据到 MongoDB 中。此外,还了解了 Mongoose 如何处理 Collection 名称的自动转换问题。希望这些信息对你理解和使用 Mongoose 有所帮助!


可以通过下面两种方式更改collection的名字: 1.xxschema = new Schema({ … }, {collection: “your collection name”});

2.mongoose.model(‘User’, UserSchema, “your collection name”);

明白了, thanks!

原来是这样子,谢谢您的回答!!!

搞了半天,难怪我查mongodb没结果,谢啦!!

user.js  mongoose.model('User',User);
index.js   var mongoose=require('mongoose');
                var Uesr = mongoose.model('User');

为什么我模仿开发指南的那本书弄得会出现

 throw new Error('Schema hasn\'t been registered for model "' + name + '"
            ^
Error: Schema hasn't been registered for model "User".
Use mongoose.model(name, schema)

正在找这个问题,领教了

正在学mongoose,也是遇到了这样的疑问,原来是小写化and尾部追加s

科学

但不是都加s,如果是fish等不可数名词,那么就不会加s

“由此我们可以推断mongoose在内部创建collection时将我们传递的collection名小写化,同时如果小写化的名称后面没有字母——s,则会在其后面添加一s,针对我们刚建的collection,则会命名为:users。”

应该说是小写然后变成复数,如楼上。

在使用 Mongoose 时,确实存在一个命名约定:Mongoose 会自动将模型名称转换为复数形式,并将其用作集合名称。例如,如果你定义了一个名为 User 的模型:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const UserSchema = new Schema({
  name: String,
  email: String,
  password: String
});

mongoose.model('User', UserSchema);

当你使用 mongoose.model('User', UserSchema) 创建模型并保存数据时,Mongoose 会自动在 MongoDB 中创建一个名为 users 的集合,而不是 User。这是因为 Mongoose 默认将模型名称转换为其复数形式。

如果你想显式指定集合名称,可以使用 collection 选项:

mongoose.model('User', UserSchema, 'myUsersCollection');

这样,在 MongoDB 中就会创建一个名为 myUsersCollection 的集合,而不是默认的 users

总结来说,Mongoose 会自动将模型名称转换为复数形式作为集合名称,但你可以通过指定第三个参数来自定义集合名称。

希望这能帮助你理解 Mongoose 在 MongoDB 中创建集合的机制。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!