簡體   English   中英

貓鼬歧視行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM