【发布时间】:2018-02-08 03:35:39
【问题描述】:
我在 Mongoose 中通过两个模型和一个鉴别键表示了一个类层次结构(简单示例):
var options = {discriminatorKey: 'kind'};
var UserSchema = new mongoose.Schema({
username: {type: String, index: true},
// some other fields
}, options);
// some schema methods
var User = mongoose.model('User', UserSchema);
var PowerUserSchema = new mongoose.Schema({
username: {type: String, index: true},
// some other fields
rank: {type: String}
}, options);
var PowerUser = User.discriminator('PowerUser', PowerUserSchema);
到目前为止,这工作正常,但是我遇到了我想将用户“提升”为 PowerUser 的情况。我最初的想法是设置一个用户的“kind”属性并在实例上调用 save() ,希望下次检索到该值时,将返回正确的猫鼬类型:
var user = ... // retrieve user
user.kind = 'PowerUser';
user.save();
user = ... // retrieve user again
这似乎不起作用,因为“种类”值没有保存到实例中。我遇到了this 的建议,不幸的是它也没有更新鉴别器的值。
我现在的问题是:我是否走在正确的轨道上?在这种情况下甚至允许更新鉴别器值,还是我应该以不同的方式更好地构造我的数据(例如,对两者使用单一模式,并使用“类型”条目指定每个实例是什么;这会产生效果对于降级情况,不会丢失任何信息。)
此外,pro(de)moting 用户不应破坏我的数据库中引用 (Power)Users 的所有实例。
谢谢!
【问题讨论】:
-
为什么不为每个用户添加角色数组,然后根据需要添加和删除它们?
-
所以你“可以”这样做,但简单地修改数据中的鉴别器值对我来说听起来不是很 OOP。大概
PowerUser具有不同的属性和可能的“验证规则”或至少一些区分的“必需”数据。因此,将对象“转换”为PowerUser然后保存它可能更“正确”。 -
而且“很遗憾没有更新”,因为您没有阅读所引用的问题。如果您查看帖子,您会看到
{discriminatorKey: 'kind'}已传递给 Schema 选项。这意味着该键的“默认”值被覆盖。这就是为什么后面的建议是设置.kind属性。默认情况下,鉴别键的属性被命名为__t。因此user.__t = "PowerUser"。但就像我说的,hacky! -
那么,在 JavaScript 中将“User”转换为“PowerUser”,并将其保存回数据库对 mongoose/mongodb 有效吗?我更喜欢这样的解决方案,因为正如您所说,它更像是 OOP。这种方法会破坏对 User 实例的现有引用吗?
-
引用的方法对我也不起作用。我觉得这是一只猫鼬虫。
标签: node.js mongodb mongoose discriminator