【问题标题】:Why does mongoose always add an s to the end of my collection name为什么猫鼬总是在我的收藏名称末尾添加一个s
【发布时间】:2012-05-19 19:11:50
【问题描述】:

例如,此代码会创建一个名为“datas”的集合

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

这段代码会创建一个名为“users”的集合

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

谢谢

【问题讨论】:

  • 这是 Rails 中的约定。您有对象“用户”,将其存储在“用户”集合中。我猜在 Mongoose 中也是如此。
  • 是的,有趣的是 var Dataset = mongoose.model('datas', dataSchema);生成一个名为 datas 的集合。
  • 似乎多元化逻辑并不那么愚蠢(或聪明,取决于您的预期)。我相信您可以了解它是如何工作的(查找源代码)。
  • @SergioTulentsev,这不是 ruby​​,但它以相同的方式工作 github.com/LearnBoost/mongoose/blob/master/lib/utils.js
  • 仅作记录。数据是复数,数据的单数是数据

标签: node.js mongodb mongoose


【解决方案1】:

Mongoose 试图通过使您的收藏名称复数来变得聪明。但是,您可以强制它成为您想要的任何东西:

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

【讨论】:

  • 我不明白添加“s”如何使框架更智能,恕我直言,这是个坏主意。除了那个猫鼬是一个很棒的框架。
  • 这是一个旧的糟糕选择,如果去掉它会破坏向后兼容性。所以我们选择坚持下去。
  • 它不只是添加一个“s”,而是使名称的复数正确。尝试使用“mouse”的例子,你会得到一个名为“mice”的集合,或者使用“person”你会得到“people”。想知道这些名字的来源让我发疯 :-)
  • 这真是太疯狂了,当您必须从另一个界面进行查询时,您使用哪个名称来查询您的收藏?
  • 我吓坏了,因为我定义了“画笔”并且有一个名为“画笔”的集合。我试图找到我定义的地方将近半个小时,但没有找到任何东西。我想:“也许它很聪明并添加了这一点。可能不是,但让我们看看...... FUUUUUUU”
【解决方案2】:

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

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

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

例子:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您可以添加集合名称作为第三个参数。查看使用 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;
      

      【讨论】:

        【解决方案5】:

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

        mongoose.pluralize(null);
        

        【讨论】:

        • 最佳解决方案,因为我们不必同时定义模型名称和集合名称。
        • 这绝对是最好的办法。
        • 我花了几个小时才了解猫鼬的这种聪明。无论如何 - 很高兴我找到了这个解决方案。顺便说一句:它还避免了集合名称的自动小写。
        • 小心,这不仅会阻止复数,还会阻止 toLowerCase()
        • 如何在连接对象上执行此操作?哪个是使用 createConnection 方法完成的?
        【解决方案6】:
        //Mongoose's definition file. NOT your model files
        1 const mongoose = require("mongoose");
        2 mongoose.pluralize(null);
        

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

        here所见。

        【讨论】:

        • 谢谢。我在公共文件中使用了以上 2 行并导入了它。与在moongose.model 中编写不同的第三个参数相比,此简化代码。
        【解决方案7】:

        在下一行定义您的架构结束时 使用此代码

        module.exports = mongoose.model("State", "StateSchema", "state")
        

        假设你的状态是你想在你的数据库上使用的,以避免 s 作为状态

        Click the link to view the picture properly

        【讨论】:

          【解决方案8】:

          当你运行这个命令时,Mongoose 会为你编译一个模型

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

          第一个参数是您的模型所针对的集合的单数名称。 Mongoose 会自动查找模型名称的复数、小写版本。因此,对于上面的示例,模型子代用于数据库中的 children 集合。

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

          【讨论】:

          • 你在重现问题?
          猜你喜欢
          • 2015-06-26
          • 2021-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-09
          • 1970-01-01
          相关资源
          最近更新 更多