猫鼬鉴别者行为

时间:2016-08-02 16:03:35

标签: mongodb mongoose

我有一些关于猫鼬鉴别器的问题。

它们是否支持多级继承?像模型C一样继承继承模型A的模型B?从阅读文档看,这似乎不可能,它只解释了一个级别的继承,例如:我有一个通用事件,然后我有特定的事件类型。

是否可以在查询中查询所有匹配的鉴别器类型?例如。有一个基本事件,我有像ClickEvent和BrowseEvent这样的特定事件。也许基本事件具有user_id字段和时间戳。我希望点击和浏览特定用户在过去1小时内发生的事件。那可能吗?文档不遗余力地解释各种查找器方法是识别器识别的,它定义为意味着它们根据查询方式自动选择正确的类型对象。例如。 ClickEvent.findOne仅返回点击事件。确实公平,但GenericEvent.findOne会返回所有事件,还是只返回通用事件?

2 个答案:

答案 0 :(得分:2)

因此,由于缺乏答案,我决定不再懒惰并编写程序来测试行为。所以我发现如果你试图拥有一个继承链,它会引发Discriminator "Derived2" can only be a discriminator of the root model行的错误。因此,您只能拥有Base模式,然后从该Base获得Derived模式。但是,如果使用Base.findOne进行查询,则可以找到任何派生类型。

答案 1 :(得分:2)

这是一个关于如何定义不同鉴别器的例子:

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var Business = require('../models/business');
var BusinessProductCategory = require('../models/businessProductCategory');
var MasterProduct = require('../models/masterProduct');

var common = require('../middlewares/common');

var nameMinLength = [3, 'The value of path `{PATH}` (`{VALUE}`) is shorter than the minimum allowed length ({MINLENGTH}).'];

var options = {discriminatorKey: 'kind'};

var businessProductSchema = mongoose.Schema({
    business: {type: Schema.Types.ObjectId, ref: 'Business'},
    productPrices: [{
        value: {type: Number, required: true},
        currency: {type: String, required: true},
        description: {type: String, required: true},
        createdAt: {type: Date, default: Date.now, required: true},
        updatedAt: {type: Date, default: Date.now, required: true}
    }],
    is_show_in_store: {type: Boolean, default: true, required: true},
    record_status: {type: String, enum: ['active', 'archived'], required: true, default: 'active'},
}, options);

businessProductSchema.post('save', common.handlerMongoErrors);
businessProductSchema.post('update', common.handlerMongoErrors);

var BusinessProduct = mongoose.model("BusinessProduct", businessProductSchema);

var ManagedProduct = BusinessProduct.discriminator('ManagedProduct', new mongoose.Schema({
    master_product: {type: Schema.Types.ObjectId, ref: 'MasterProduct'},
}), options);

var LocalProduct = BusinessProduct.discriminator('LocalProduct', new mongoose.Schema({
    name: {type: String, required: true, minlength: nameMinLength},
    description: {type: String},
    primary_category: {type: Schema.Types.ObjectId, ref: 'BusinessProductCategory'},
    brand: {type: String, required: true},
    created_at: {type: Date, required: true},
    updated_at: {type: Date, required: true},
}, options));

module.exports = {BusinessProduct: BusinessProduct, ManagedProduct: ManagedProduct, LocalProduct: LocalProduct};

如果在find()方法中使用子类,则可以使用find()方法中的ParentModel查询所有文档,这样您只会过滤用于调用查找的子类型。