问个关于mongoose的Nodejs问题?

问个关于mongoose的Nodejs问题?

我定义了一个user的模型 mongoose.model(‘User’, UserSchema); 为什么mongoose自动在我表里创建一张表是users ,而不是user。 怎么会多了一个s ,哪个参数是对应表名称的啊? 那个s能不要嘛??

5 回复

当然可以。让我们来详细解释一下这个问题。

问题背景

你定义了一个名为 User 的 Mongoose 模型,并且使用了 mongoose.model('User', UserSchema) 来创建这个模型。但是你发现,Mongoose 在数据库中创建了一个集合(collection),名字是 users,而不是你期望的 user

解释

Mongoose 默认会将模型名称转换为复数形式作为数据库中的集合名称。这是为了符合大多数数据库的设计规范,因为在关系型数据库中,一个表通常用来存储同一类数据的所有实例。例如,users 表是用来存储所有用户的数据。

如何修改

如果你希望自定义集合名称,可以在定义模型时通过传递第三个参数来指定。以下是具体的代码示例:

const mongoose = require('mongoose');

// 定义 schema
const UserSchema = new mongoose.Schema({
    name: String,
    email: String,
    password: String
});

// 使用第三个参数来指定集合名称
const User = mongoose.model('User', UserSchema, 'user');

module.exports = User;

在这个例子中,我们使用了 mongoose.model('User', UserSchema, 'user'),这样就明确指定了集合名称为 user 而不是默认的 users

总结

  • 默认行为:Mongoose 默认会将模型名称转换为复数形式作为集合名称。
  • 如何覆盖:可以通过传递第三个参数来指定自定义的集合名称。

希望这能帮助你解决问题!如果你还有其他疑问或需要进一步的帮助,请随时提问。


var UserSchema = new Schema({
  a : String,
  b : String 
}, { collection: 'user' });

签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

and if you are using mongoose 2.0.0, pass the collectionName as the third argument:

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

签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

可以了 ,3Q 。。

在Mongoose中,默认情况下,模型名会被转换为复数形式来作为集合名。例如,如果你定义了一个名为 User 的模型,那么它会默认使用 users 作为集合名。这是为了适应MongoDB的集合命名规范。

如果你不希望Mongoose自动添加复数后缀,可以通过传递第三个参数来明确指定集合名。示例如下:

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

// 定义用户Schema
const UserSchema = new Schema({
    name: String,
    email: String,
    password: String
});

// 明确指定集合名
const User = mongoose.model('User', UserSchema, 'user');

module.exports = User;

在这个例子中,我们通过第三个参数 'user' 显式指定了集合名,这样Mongoose就会使用 user 而不是 users 作为集合名。

如果你已经有了很多数据,并且希望更改现有的集合名,可以在创建模型时直接指定对应的集合名,或者修改你的数据库中的集合名。但通常情况下,显式指定集合名是一个更安全的做法,可以避免因默认行为导致的意外情况。

回到顶部