我想要一个名称中包含连字符的模型

问题描述 投票:0回答:2

正常名称的模型即可获得结果。

但是,名称中包含连字符的模型无法获得结果。

users-permissions
,
user
包含数据。

const db = await mongoose.connect("mongodb://URL", {...});


const userModel= db.model("user", new mongoose.Schema({}));
const usersPermissionsModel = db.model("users-permissions", new mongoose.Schema({}));


console.log(await userModel.find().limit(1)) // Object data
console.log(await usersPermissionsModel.find().limit(1)) // [], null array

我认为型号名称中有连字符,因此不会查询。是这样吗?

有解决办法吗?

mongodb mongoose
2个回答
0
投票

TL;博士

在 mongo 集合中使用

-
没有问题,猫鼬命名约定也不会修改您的
users-permissions
集合名称。检查您的数据库是否有正确的集合名称,并且集合中是否有文档。


当您在 mongoose 中创建模式和模型时,mongoose 在数据库中创建集合时将自动应用它自己的命名约定。

这通常没问题,但看起来您已经在 mongodb 中拥有一些数据,您正在尝试使用 mongoose 访问这些数据。您可以像这样覆盖集合名称:

const usersPermissionsSchema = new mongoose.Schema({}, { collection: 'users-permissions' })
const usersPermissionsModel = db.model("users-permissions", usersPermissionsSchema);

来自架构文档:

选项:收藏

Mongoose 默认情况下通过将模型名称传递给

utils.toCollectionName
方法来生成集合名称。此方法使名称复数。如果您需要为您的收藏使用不同的名称,请设置此选项。

令人烦恼的是 utils.toCollectionName 没有记录,但查看 源代码

这让我找到了另一个包含pluralize方法的repo,以及关于命名约定的SO问题

但是该复数方法中的规则不会影响您的

"users-permissions"
名称,所以我认为您实际上可能有拼写错误或该集合中不存在模型。通过 CLI 或 NoSQLBooster 等 GUI 工具检查您的数据库。


0
投票

Mongoose 虚拟属性显然不能在名称中使用连字符,所以我相信这可能与您发现的问题有关。我没有在 https://mongoosejs.com/docs/tutorials/virtuals.html 中看到此记录,但只是通过将虚拟属性名称更改为具有连字符并在模板上进行相同的更改来测试它。它返回 NaN。删除模型的虚拟属性名称和模板上的连字符,它会再次起作用。

© www.soinside.com 2019 - 2024. All rights reserved.