为什么mongoose总是在我的集合名称的末尾添加一个s

Bob*_*Ren 104 mongoose mongodb node.js

例如,此代码会生成一个名为"datas"的集合

var Dataset = mongoose.model('data', dataSchema);
Run Code Online (Sandbox Code Playgroud)

此代码导致创建一个名为"users"的集合

var User = mongoose.model('user', dataSchema);
Run Code Online (Sandbox Code Playgroud)

谢谢

aar*_*ann 172

猫鼬正试图变得聪明.然而,你可以强迫它成为你想要的任何东西:

var dataSchema = new Schema({..}, { collection: 'data' })

  • 我不明白如何添加"s"使框架更加智能,恕我直言,这是一个坏主意.除了那个猫鼬是一个很棒的框架. (23认同)
  • 它不只是添加一个's',而是正确复数的名称.尝试使用'鼠标'的实例,你会得到一个名为'老鼠'或'人'的集合你会得到'人'.这让这些名字来自哪里让我疯狂:-) (14认同)
  • 我吓坏了,因为我定义了“brush”并且有一个名为“brushes”的集合。我试图找到我在近半小时内定义它的地方,但没有找到任何东西。我想:“也许它很聪明并补充说。可能不是,但让我们看看......FUUUUUUU” (12认同)
  • 它是一个古老的糟糕选择,如果取出它会破坏向后兼容性.所以我们选择坚持下去. (10认同)
  • 现在这非常疯狂,当您必须从另一个界面进行查询时,您特别使用哪个名称来查询您的集合? (3认同)
  • 愚蠢的海事组织。我想知道为什么使用对“历史”模式的引用会导致“历史”中的更新而脚本中没有任何别名。我最终得出结论,猫鼬正在做一些“聪明”的事情,因此我发现自己在这里,但这是一种非直观的默认行为。 (2认同)

Nis*_*gla 41

mongoose.model的API结构是这样的:

Mongoose#model(name, [schema], [collection], [skipInit])
Run Code Online (Sandbox Code Playgroud)

mongoose做的是,当没有传递集合参数时,Mongoose通过复制模型名称来生成集合名称.如果您不喜欢此行为,请传递集合名称或设置模式集合名称选项.

例:

var schema = new Schema({ name: String }, { collection: 'actor' });
Run Code Online (Sandbox Code Playgroud)

要么

schema.set('collection', 'actor');
Run Code Online (Sandbox Code Playgroud)

要么

var collectionName = 'actor'
var M = mongoose.model('Actor', schema, collectionName);
Run Code Online (Sandbox Code Playgroud)


And*_*kin 10

从猫鼬5.x开始,您可以完全禁用它:

mongoose.pluralize(null);
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以简单地添加一个字符串作为第三个参数来定义集合的实际名称。扩展示例,以使名称分别为datauser

var Dataset = mongoose.model('data', dataSchema, 'data');

var User = mongoose.model('user', dataSchema, 'user');
Run Code Online (Sandbox Code Playgroud)


Dan*_*ura 5

//Mongoose's definition file. NOT your model files
1 const mongoose = require("mongoose");
2 mongoose.pluralize(null);
Run Code Online (Sandbox Code Playgroud)

mongoose.pluralize(null)在您的 Mongoose 文件中添加该行将阻止集合名称的复数形式。您不需要将此行添加到模型文件中。

这里所见。