【问题标题】:Mongoose -- Force collection nameMongoose -- 强制集合名称
【发布时间】:2011-11-21 03:21:41
【问题描述】:

我正在尝试使用 mongoose 在其中创建一个数据库和一个集合。我的代码是:

var mongoose = require('mongoose');
    var db = mongoose.connect('mongodb://localhost/testdb');
    var Schema = mongoose.Schema;

    var UserInfo = new Schema({
    username : String,
    password : String 
    });

    mongoose.model('UserInfo', UserInfo);

    var user = db.model('UserInfo');


    var admin = new user();
    admin.username = "sss";
    admin.password = "ee";
    admin.save();

当我运行此代码时,猫鼬创建了名为 UserInfo 而不是 userinfo 的集合。 如何在猫鼬中强制集合名称?

【问题讨论】:

  • 趣事:猫鼬知道 ox 的复数形式是 oxen,但不知道 goose 的复数形式是 geese。

标签: mongodb mongoose


【解决方案1】:

应该这样做

var UserInfo = new Schema({
  username : String,
  password : String 
}, { collection: 'userinfo' });

有关更多信息,请参阅 Mongoose 文档中的 this link

【讨论】:

  • 谢谢。以下是相关链接:mongoosejs.com/docs/guide.html#collection
  • 谢谢@JonPage,我想知道为什么我的 Person 对象集合被命名为 people。您提供的链接是一个很好的参考。我认为这种在创建模式时设置自定义集合名称的方法比在创建模型时定义集合名称的其他方法更好。
  • 这非常有帮助。我花了两天时间试图查询一些东西。
【解决方案2】:

如果您使用的是 mongoose 2.0.0,请将 collectionName 作为第三个参数传递

mongoose.model('UserInfo', UserInfo, 'UserInfo');

【讨论】:

  • 在模型级别声明自定义集合名称的完美方式。
  • 这个答案并没有说明这在 2.0.0 之前是否仍然有效,或者是否从 2.0.0 开始实施。
【解决方案3】:

您需要在架构中设置集合名称。

new Schema({...},{collection: 'userInfo'});

【讨论】:

    【解决方案4】:

    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);
    

    【讨论】:

      【解决方案5】:

      默认情况下,Mongoose 会在集合名称中添加 's'。如果你想避免这种情况,只需将集合的名称作为第三个参数传递:

      var mongoose = require('mongoose');
      var db = mongoose.connect('mongodb://localhost/testdb');
      var Schema = mongoose.Schema;
      
      var UserInfo = new Schema({
          username: String,
          password: String 
      });
      
      mongoose.model('UserInfo', UserInfo, 'UserInfo')
      
      tan = new user();
      admin.username = 'sss';
      admin.password = 'ee';
      admin.save();
      

      【讨论】:

      • 这是最好的建议。我一直发现在 mongoose.model() 中传递集合名称是最简单的。还有助于指出 mongoose 是如何将集合名称复数的,这在我刚开始时很困惑。
      【解决方案6】:

      这里是 Mongoose 的维护者。我们建议使用mongoose.model('UserInfo', UserInfo, 'UserInfo');mongoose.model() 的第三个参数是集合名称。 Here's the relevant docs.

      【讨论】:

        【解决方案7】:

        你的模型名称:userInfo.js

        在快速路由文件或 app.js 中

        var mongoose = require('mongoose');
        mongoose.connect('mongodb://localhost/testdb');
        

        然后在你的 userInfo.js 中

        var mongoose = require('mongoose');
        var Schema = mongoose.Schema;
        var UserInfo = new Schema({
         username : String,
         password : String 
        });
        module.exports = mongoose.model('UserInfo', UserInfo);
        

        【讨论】:

          【解决方案8】:

          答案:

          mongoose.model('UserInfo', UserInfo, 'userinfo'); //3rd parameter 'userinfo': as collection name
          

          更好的语法解释:

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

          参数说明:

          • 第一个参数-名称模型名称
          • 第二个参数 [schema] 架构名称
          • 第三个参数[collection] 集合名称(可选,由模型名称导出)
          • 第四个参数[skipInit]是否跳过初始化(默认为false)

          【讨论】:

            【解决方案9】:

            module.exports = mongoose.model('name', schema, 'collection') 上传递第三个参数会覆盖基于模型名称的自动集合名称,这已经得到了回答.. 但还有其他两种方式,

            每个 mongoose.model 文档链接: https://mongoosejs.com/docs/api.html#mongoose_Mongoose-model

            有 3 种方法可以手动输入集合名称:

            var schema = new Schema({ name: String }, { collection: 'actor' });
            
            // or
            
            schema.set('collection', 'actor');
            
            // or
            
            var collectionName = 'actor'
            var M = mongoose.model('Actor', schema, collectionName)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-09-22
              • 2013-07-22
              • 2015-05-21
              • 1970-01-01
              • 2020-08-06
              • 2014-09-21
              • 2017-09-06
              • 2020-11-11
              相关资源
              最近更新 更多