Mongoose ODM在MongoDB集合中保存了错误的模型名称

时间:2019-04-01 20:00:52

标签: javascript node.js mongoose odm

你好Stackoverflowers!

猫鼬创建一个名为“保险箱”的集合时遇到了一个奇怪的问题。

这是我的示例代码:

const mongoose = require('mongoose')
mongoose.connect('mongodb://mongodb:27017/test', { useNewUrlParser: true })

const Safe = mongoose.model('Safe', { name: String })

const safe = new Safe({ name: 'foobar' })
safe.save().then(() => console.log('done'))

当我打开数据库外壳并发出以下命令时:

mongo test --eval "db.getCollectionNames()"

其回应为:

MongoDB shell version v4.0.6
connecting to: mongodb://127.0.0.1:27017/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f9cfa8b9-58e2-40b8-9907-ecd18039935a") }
MongoDB server version: 4.0.6
[ "saves" ]

现在,我试图用集合名称“ Safes”创建一个模型,猫鼬似乎从保险柜>保存...中更改了它。

猫鼬有某种无法使用的受保护模型吗?

2 个答案:

答案 0 :(得分:1)

似乎他们对以“ fe”结尾的单词设置了规则,因为它们通常转换为“ ves”(刀->刀)的复数形式。

您可以通过在Schema中添加另一个参数来设置自己的集合名称:

const safeSchema = new Schema({ name: String }, { collection: 'safes' })

答案 1 :(得分:1)

猫鼬util.toCollectionName基于模式名称生成集合的名称。它确实使用了一些正则表达式,其中之一是:

  [/(?:([^f])fe|([lr])f)$/gi, '$1$2ves'],

匹配sa fe 并将其替换为sa ves

source