为什么猫鼬总是在收藏名称的末尾添加s


120

例如,此代码导致创建名为“数据”的集合

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

并且此代码导致创建了一个名为“用户”的集合

var User = mongoose.model('user', dataSchema);

谢谢


3
这是Rails中的约定。您有对象“用户”,将其存储在“用户”集合中。我猜猫鼬也一样。
塞尔吉奥·图伦采夫

是的,有趣的是,var Dataset = mongoose.model('datas',dataSchema); 结果称为数据的集合。
鲍勃·

似乎多元逻辑不是那么愚蠢(或聪明,取决于您的期望)。我相信您可以找到它是如何工作的(找到源代码)。
塞尔吉奥·图伦采夫

2
@SergioTulentsev,不是红宝石,但是它以相同的方式工作github.com/LearnBoost/mongoose/blob/master/lib/utils.js

7
仅作记录。数据是复数,数据是单数
Luis Sieira

Answers:


200

猫鼬通过使收藏名称复数来尝试变得聪明。但是,您可以强制将其设置为所需的值:

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


31
我不明白添加“ s”如何使框架更智能,恕我直言,这是一个坏主意。除了那个猫鼬,还有一个很棒的框架。
罗伯托

14
它是一个过时的选择,如果将其取出,则会破坏向后兼容性。因此我们选择坚持下去。
aaronheckmann

18
它不仅会添加一个“ s”,而且还会使名称正确复数。尝试使用“ mouse”的实例,您将获得一个名为“ mice”的集合,或者使用“ person”,您将得到“ people”。让我发狂的是,我不明白这些名字的
来历

3
现在这非常疯狂,当您必须从另一个接口进行查询时,尤其是在查询集合时使用哪个名称?
Xsmael

8
我吓坏了,因为我定义了“画笔”,并且有一个名为“画笔”的集合。半个小时以来,我一直在试图找到我在哪里定义的内容,但没有发现任何东西。我以为:“也许这很聪明,并补充了一点。也许不是,但是让我们看看...。FUUUUUUU”
Fusseldieb

49

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

Mongoose#model(name, [schema], [collection], [skipInit])

猫鼬所做的是,当不传递任何集合参数时,猫鼬通过使模型名称复数来产生一个集合名称。如果您不喜欢这种行为,请传递一个集合名称或设置您的模式集合名称选项。

例:

var schema = new Schema({ name: String }, { collection: 'actor' });

要么

schema.set('collection', 'actor');

要么

var collectionName = 'actor'
var M = mongoose.model('Actor', schema, collectionName);

30

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

mongoose.pluralize(null);

最佳解决方案,因为我们不必同时定义模型名称和集合名称。
Nezih

这绝对是最好的方法。
netishix

1
我花了几个小时来学习这种猫鼬的聪明才智。无论如何-很高兴我找到了这个解决方案。顺便说一句:它还避免了自动降低名称的首字母大写。
BernhardFürst

8

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

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

var User = mongoose.model('user', dataSchema, 'user');

2

您可以将集合名称添加为第三个参数。请参阅使用Typescript的示例:

import DataAccess = require('../DataAccess');
import IUser = require("../../Models/Interfaces/IUser");

var mongoose = DataAccess.mongooseInstance;
var mongooseConnection = DataAccess.mongooseConnection;

class UserSchema {
        static get schema () {
        var schema =  mongoose.Schema({
            _id : {
                type: String
            },
            Name: {
                type: String,
                required: true
            },
            Age: {
                type: Number,
                required: true
            }
        });

        return schema;
    }
}
var schema:any = mongooseConnection.model<IUser>("User", 
UserSchema.schema,"User");
export = schema;

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

添加线mongoose.pluralize(null)在您的Mongoose文件中防止集合名称复数。您无需将此行添加到模型文件中。

这里所见。



-2

当您运行此命令时,猫鼬会为您编译模型

var schema = new mongoose.Schema({ name: 'string', size: 'string' });
var child = mongoose.model('child', schema);

第一个参数是您的模型所使用的集合的单数名称。猫鼬会自动寻找模型名称的复数形式,小写形式。因此,对于上面的示例,模型子对象用于数据库中的子对象集合。

注意:.model()函数将复制架构。调用之前,请确保已添加了要架构的所有内容,包括钩子.model()


您正在重现问题吗?
Pedro JR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.