Nodejs mongoose创建module问题

Nodejs mongoose创建module问题

我在用mongose创建module时,遇到了一个问题: 会自动给我加个's' 比如:mongoose.model(‘Cat’, { name: String }); 我创建后 cat 就成了 cats 了,不知道为什么。版本是3.8.20

3 回复

在使用 Mongoose 创建模块时,你可能会遇到模型名称被自动复数化的情况。这是 Mongoose 的默认行为,用于将模型名称转换为数据库集合的名称。例如,你创建了一个名为 Cat 的模型,Mongoose 会将其映射到名为 cats 的集合。

如果你不希望这种自动复数化的行为,可以在定义模型时指定集合名称。以下是一些示例代码,解释如何解决这个问题:

示例代码

自动复数化

const mongoose = require('mongoose');

// 定义 Cat 模型
const CatSchema = new mongoose.Schema({
  name: String
});

const Cat = mongoose.model('Cat', CatSchema);

// 使用 Cat 模型
const kitty = new Cat({ name: 'Zildjian' });
kitty.save((err) => {
  if (err) console.error(err);
  else console.log('Saved a kitty!');
});

在这个例子中,Cat 模型会被映射到 cats 集合。

手动指定集合名称

如果你想手动指定集合名称,可以使用 mongoose.model() 方法的第三个参数:

const mongoose = require('mongoose');

// 定义 Cat 模型,并手动指定集合名称
const CatSchema = new mongoose.Schema({
  name: String
});

const Cat = mongoose.model('Cat', CatSchema, 'cat'); // 第三个参数指定集合名称

// 使用 Cat 模型
const kitty = new Cat({ name: 'Zildjian' });
kitty.save((err) => {
  if (err) console.error(err);
  else console.log('Saved a kitty!');
});

在这个例子中,Cat 模型会被映射到 cat 集合,而不是默认的 cats

解释

  1. 自动复数化:Mongoose 默认会将模型名称 Cat 转换为复数形式 cats,这是为了与 MongoDB 的集合命名习惯一致。
  2. 手动指定集合名称:通过传递第三个参数 cat,你可以明确告诉 Mongoose 使用 cat 这个集合名称,而不是自动转换为 cats

这样,你就可以避免 Mongoose 自动添加 s 的问题,并且可以根据需要自定义集合名称。


不是只有你这样

在使用 Mongoose 创建模型时,默认情况下,Mongoose 会根据你的集合名称自动生成一个复数形式的集合名。这就是为什么当你定义 mongoose.model('Cat', { name: String }); 时,Mongoose 实际上会在数据库中使用 cats 这个集合。

如果你不希望 Mongoose 自动进行这种复数转换,可以显式地指定集合名称。你可以通过传递一个选项对象来实现这一点,如下所示:

const mongoose = require('mongoose');

const CatSchema = new mongoose.Schema({ name: String });

const Cat = mongoose.model('Cat', CatSchema, 'cats'); // 显式指定集合名为 'cats'

这样,你创建的模型将直接关联到名为 cats 的集合,而不会被 Mongoose 自动转换为复数形式。

示例代码

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

// 定义猫的 schema
const CatSchema = new Schema({
    name: String
});

// 创建模型并指定集合名称
const Cat = mongoose.model('Cat', CatSchema, 'cats');

// 使用模型
const kitty = new Cat({ name: 'Zildjian' });
kitty.save((err) => {
    if (err) console.error(err);
    else console.log('保存成功!');
});

这样,你可以确保模型与你期望的集合名称匹配。

回到顶部