【问题标题】:Mongoose relationship猫鼬关系
【发布时间】:2014-06-15 18:23:50
【问题描述】:

我正在研究 Mongodb,我正在使用 Mongoose,我想创建一个非常动态的注册过程。我使用 Passport 管理了注册的第一步,一切正常,我创建了用户并且它存在于数据库中。现在我的注册过程将继续,用户必须选择一个“角色”:你是什么样的用户?有 2 个选项:“基本”和“高级”。 Basic 仅有 3 个属性,advanced 有 3 个基本属性以及其他几个属性。

我需要扩展 userSchema 或添加基于该角色的新字段,但一周后它还不起作用,我尝试了许多 NPM,例如:mongoose-relationship猫鼬模式扩展

这基本上就是我所拥有的:

userSchema = new Schema({
   id           : Number,
   email        : { type: String, required: true },
   role         : { type: String, required: true },
   profile      : { ... } // Profile fields are different for each role.
});

// profile 1
basicSchema = new Schema({
   info1        : { type: String, required: true },
   info2        : { type: String, required: true },
   info3        : { type: String, required: true }
});

// profile 2
advancedSchema = new Schema({
   info1        : { type: String, required: true },
   info2        : { type: String, required: true },
   info3        : { type: String, required: true },
   info4        : { type: String, required: true },
   info5        : { type: String, required: true },
   info6        : { type: String, required: true }
});

用户已经存在并且他在一个屏幕上,他需要选择一个角色并填充所选的配置文件。

关于我使用 nodejsexpressjs 的信息。

希望你能帮上忙。谢谢。

【问题讨论】:

  • 用户的个人资料对象是否需要存在于用户对象之外?或者您总是将它与 User 对象一起获取?

标签: database node.js express mongoose


【解决方案1】:

使用猫鼬模式扩展:

通过 npm 安装:$ npm install mongoose-schema-extend

使用您的代码的示例:

var mongoose = require('mongoose'),
    extend = require('mongoose-schema-extend');
var Schema = mongoose.Schema;

var userSchema = new Schema({
   id           : Number,
   email        : { type: String, required: true },
   role         : { type: String, required: true },
},{ collection : 'users' });

//profile 1
var basicSchema = userSchema.extend({
   info1        : { type: String, required: true },
   info2        : { type: String, required: true },
   info3        : { type: String, required: true }
});

//profile 2
var advancedSchema = userSchema.extend({
   info1        : { type: String, required: true },
   info2        : { type: String, required: true },
   info3        : { type: String, required: true },
   info4        : { type: String, required: true },
   info5        : { type: String, required: true },
   info6        : { type: String, required: true }
});

mongoose-schema-extend

【讨论】:

  • 感谢您的回答,但如果用户已经存在,则它不起作用。
【解决方案2】:

这就是你想要的。 “继承”的概念和歧视领域。试一试。我使用它并创造了奇迹。基本上,您有 3 种类型的用户:基本用户、高级用户和专家用户。每个都基于您的核心/基础模型,然后您使用所需的额外属性进行扩展,为每个角色定义一个继承。

这为您带来了很多优势,主要是:mongoose 将填充适当的模型并启动您在派生模型中进行的任何验证等。

https://github.com/briankircho/mongoose-schema-extend

【讨论】:

  • 嗨@Biba,它看起来不错,我正在尝试一些东西,但仍然没有成功......您能否提供使用它的示例,而不使用 id 但具有特定键:值?干杯。
  • 最好的例子就在这里:github.com/briankircho/mongoose-schema-extend。阅读名为 Discriminatory key 的部分。使用那里的概念来应用到您想要实现的 3 个角色。
  • 经过多次尝试,问题是我已经创建了用户,当我选择角色并尝试创建该角色的新实例时,它不起作用。我需要扩展现有用户,而不是创建具有全部属性的新用户...
猜你喜欢
  • 2023-03-19
  • 2017-03-31
  • 2018-01-22
  • 2018-08-23
  • 2014-10-17
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多