关于Nodejs中mongo文档名命名的问题,求解

关于Nodejs中mongo文档名命名的问题,求解

在我用mogoose的create创建一条数据的时候,比如说这样:temp.create();我发现我去数据库查询的时候变成了temps……这个过程会自动将其转换成小写,并添加s吗???

4 回复

在Node.js中使用Mongoose时,如果你发现插入的数据的集合名称(collection name)被自动转换为复数形式,这是Mongoose的一个默认行为。Mongoose默认将模型名转换为其对应的集合名,规则是将模型名变为复数形式。例如,模型名为Temp,则对应的集合名会被自动设置为temps

示例代码

假设我们有一个用户模型(User Model),我们希望将用户数据保存到MongoDB中。

const mongoose = require('mongoose');

// 定义用户模型
const userSchema = new mongoose.Schema({
    username: String,
    password: String
});

// 创建模型
const User = mongoose.model('User', userSchema);

// 连接到MongoDB
mongoose.connect('mongodb://localhost/testdb', { useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('Connected to MongoDB'))
    .catch(err => console.error('Could not connect to MongoDB', err));

// 插入一条数据
const newUser = new User({
    username: 'testUser',
    password: 'testPassword'
});

newUser.save()
    .then(result => console.log('User saved:', result))
    .catch(err => console.error('Error saving user:', err));

在这个例子中,User模型对应的是users集合。如果你定义的模型名为Temp,那么它将对应temps集合。

如何自定义集合名称

如果你不希望Mongoose进行这种默认的复数转换,可以在定义模型时通过collection选项指定具体的集合名称:

const userSchema = new mongoose.Schema({
    username: String,
    password: String
}, {
    collection: 'custom_users' // 自定义集合名称
});

const User = mongoose.model('User', userSchema);

这样,即使模型名为User,数据也会被保存到custom_users集合中。

总结

  • Mongoose默认将模型名转换为复数形式作为集合名。
  • 如果需要自定义集合名,可以使用collection选项进行指定。
  • 这种机制使得数据存储更加符合语义化和规范化,但也可能导致一些意外的情况,因此需要根据实际情况选择是否自定义集合名。

在你使用前有这一样一句:mogoose.model(name, schema); 这个 name 是你指定的,这就是你这里的 temps

是自动加上复数的,而且还有个有意思的现象。我记得有回试着用mongoose创建一个Person集合,进了库里一看,被转成Peoples了:)。

在MongoDB中,使用Mongoose时,默认情况下,Mongoose会根据你的模型名称自动生成集合名称(即文档名)。具体来说,Mongoose会将模型名称变为复数形式,并且全部转换为小写。

例如,如果你定义了一个模型名为Temp,那么Mongoose会在数据库中创建一个名为temps的集合。这是因为Mongoose默认将模型名称的首字母大写部分转换为小写,并加上“s”。

示例代码

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

// 定义一个名为 Temp 的模型
const TempSchema = new Schema({
    name: String,
    age: Number
});

const Temp = mongoose.model('Temp', TempSchema);

// 创建一个新的文档
Temp.create({ name: 'Alice', age: 30 })
    .then(doc => console.log(doc))
    .catch(err => console.error(err));

在这个例子中:

  1. Temp 是模型名称。
  2. Mongoose 自动将 Temp 转换为 temps 并作为集合名称来存储数据。

如果你想自定义集合名称而不是让Mongoose自动生成,可以在定义模型时指定集合名称:

const Temp = mongoose.model('Temp', TempSchema, 'custom_collection_name');

这样,Mongoose就会使用 custom_collection_name 作为集合名称,而不是自动生成的 temps

总结

Mongoose 默认会将模型名称转换为复数形式并全小写作为集合名称。你可以通过传递第三个参数来覆盖这个默认行为,指定你自己的集合名称。

回到顶部