2016-08-02 4 views
0

私はモンゴスの弁別者についていくつか質問があります。mongoose discriminatorsのふるまい

複数のレベルの継承をサポートしていますか?モデルCはモデルAを継承するモデルBを継承しますか?ドキュメントを読むことから、これは可能ではありませんが、継承のレベルは1つしか説明できません。私は一般的なイベントを持っているし、その下に特定のイベントタイプがあります。

クエリで一致するすべてのディスクリミネータタイプをクエリできますか。例えば。基本イベントを持っており、ClickEventやBrowseEventのような特定のイベントがあります。そして、おそらくベースイベントはuser_idフィールドとタイムスタンプを持っています。特定のユーザーが過去1時間以内に発生したイベントをクリックして参照する必要があります。それは可能ですか?ドキュメンテーションは、様々なファインダメソッドが識別器であることを説明する方法から脱します。これは、照会された方法に基づいて適切な種類のオブジェクトを自動的に選択することを意味します。例えば。 ClickEvent.findOneはクリックイベントのみを返します。 [OK]十分に公正ですが、GenericEvent.findOneはすべてのイベント、または汎用イベントを返しますか?

答えて

1

回答が不足しているため、私は怠惰ではなく、動作をテストするプログラムを作成することにしました。だから私が見つけたのは、継承チェーンを持つことを試みると、Discriminator "Derived2" can only be a discriminator of the root modelという行に沿ってエラーが発生するということです。そのため、BaseスキーマとそのBaseからのDerivedスキーマしか持てません。ただし、Base.findOneを使用してクエリを実行すると、派生型が見つかります。

1

これは別の弁別を定義する方法についての例である:

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を使用してすべての文書を照会することができます検索の呼び出しに使用した子のタイプのみをフィルタリングします。

+0

これは、ディスクリミネータをコントローラからの使用に適切な方法で定義する方法を理解する助けになりました:) –

関連する問題