我通过两个模型和一个区分键(简单的示例)在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。我最初的想法是设置用户的“种类”属性,并在实例上调用save(),希望一旦下次检索到该值,将返回正确的猫鼬类型:

var user = ... // retrieve user
user.kind = 'PowerUser';
user.save();
user = ... // retrieve user again


由于“种类”值未保存到实例,因此这似乎不起作用。我遇到了this建议,不幸的是,该建议也没有更新鉴别值。

我现在的问题是:我是否在正确的轨道上?是否在这样的情况下甚至允许更新鉴别值,或者我应该以其他方式更好地构造数据(例如,对两者使用单个架构,并使用“类型”条目指定每个实例的含义;这会产生影响对于降级的情况,不会丢失任何信息。)

此外,推广用户不应破坏我的数据库中引用(Power)Users的所有实例。

谢谢!

最佳答案

最后,我通过执行以下操作使它起作用:

var user = ... // retrieve user
var powerUser = PowerUser.hydrate(user.toObject());
powerUser.kind = 'PowerUser';
powerUser.save();
powerUser = ... // retrieve user again


顺便提一句,将PowerUser降级为User似乎不起作用。

关于node.js - 更改 Mongoose 中的鉴别值/鉴别类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44250262/

10-11 01:12