我有一些关于猫鼬鉴别器的问题。
它们是否支持多级继承?像模型C一样继承继承模型A的模型B?从阅读文档看,这似乎不可能,它只解释了一个级别的继承,例如:我有一个通用事件,然后我有特定的事件类型。
是否可以在查询中查询所有匹配的鉴别器类型?例如。有一个基本事件,我有像ClickEvent和BrowseEvent这样的特定事件。也许基本事件具有user_id字段和时间戳。我希望点击和浏览特定用户在过去1小时内发生的事件。那可能吗?文档不遗余力地解释各种查找器方法是识别器识别的,它定义为意味着它们根据查询方式自动选择正确的类型对象。例如。 ClickEvent.findOne
仅返回点击事件。确实公平,但GenericEvent.findOne
会返回所有事件,还是只返回通用事件?
答案 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查询所有文档,这样您只会过滤用于调用查找的子类型。