[英]mongoose discriminators behavior
我對貓鼬歧視者有一些疑問。
它們是否支持多個繼承級別? 就像模型C繼承了模型B一樣,后者繼承了模型A? 從閱讀文檔看來,這似乎是不可能的,它僅解釋了一個繼承級別,例如,我有一個通用事件,然后在此之下有特定的事件類型。
是否可以在查詢中查詢所有匹配的鑒別器類型? 例如,有一個基本事件,而我有一個特定事件,例如ClickEvent和BrowseEvent。 也許該基本事件具有一個user_id字段和一個時間戳。 我還希望單擊和瀏覽特定用戶在過去1個小時內發生的事件。 那可能嗎? 該文檔竭力說明各種查找程序方法可識別區分符,將其定義為意味着它們根據查詢的方式自動選擇正確的種類對象。 例如, ClickEvent.findOne
僅返回點擊事件。 足夠公平,但是GenericEvent.findOne
返回所有事件還是僅返回通用事件?
因此,由於缺乏答案,我決定不再懶惰,而是編寫一個程序來測試行為。 因此,我發現,如果您嘗試擁有一個繼承鏈,則會沿Discriminator "Derived2" can only be a discriminator of the root model
的路線拋出錯誤,它Discriminator "Derived2" can only be a discriminator of the root model
。 因此,您只能具有一個基礎架構,然后具有該基礎的派生架構。 但是,如果使用Base.findOne
查詢,則會找到任何派生類型。
這是有關如何定義不同區分符的示例:
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()方法中使用子項,則可以使用ParentModel在find()方法中查詢所有文檔,因此您將僅過濾用於調用find的子項的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.