web-dev-qa-db-ja.com

マングースの継承

こんにちは、マングースライブラリのスキーマを継承する必要があります。そのための完全なプラグインはありますか?それとも私はそれを自分でどのようにすべきですか?

ベーススキーマからもすべてのpre、post、initミドルウェアを継承する必要があります。

16
Erik

あなたはマングースプラグインの使用を検討したいかもしれません:

「箱から出して」あなたが望むことをするプラグインはここにあります:

15
hunterloftis

この機能を探している他の人のために、Mongoose3.8にはDiscriminator機能を介したスキーマ継承があります。

https://github.com/LearnBoost/mongoose/pull/1647

16
regretoverflow

異なるコレクションを使用する場合:

function extendSchema (Schema, definition, options) {
  return new mongoose.Schema(
    Object.assign({}, Schema.obj, definition),
    options
  );
}

使用法:

const UserSchema = new mongoose.Schema({
  firstname: {type: String},
  lastname: {type: String}
});

const ClientSchema = extendSchema(UserSchema, {
  phone: {type: String, required: true}
});

https://www.npmjs.com/package/mongoose-extend-schema

3
Do Async

これはオールディーズだと知っていますが、同じ質問に対する答えを探してここに到着し、少し違うことをしてしまいました。すべてのドキュメントが同じコレクションに保存されているため、識別子を使用したくありません。

ModelBase.js

var db = require('mongoose');

module.exports = function(paths) {
    var schema = new db.Schema({ 
        field1: { type: String, required: false, index: false },
        field2: { type: String, required: false, index: false } 
    }, { 
        timestamps: { 
            createdAt: 'CreatedOn', 
            updatedAt: 'ModifiedOn' 
        } 
    });

    schema.add(paths);

    return schema;
};

NewModel.js

var db = require('mongoose');
var base = require('./ModelBase');
var schema = new base({
    field3: { type: String, required: false, index: false },
    field4: { type: String, required: false, index: false }
});

db.model('NewModelItem', schema, 'NewModelItems');

4つのフィールドすべてがNewModelItemに含まれます。同じフィールド/オプションなどを使用する他のモデルにはModelBaseを使用します。私のプロジェクトでは、そこにタイムスタンプを入れました。

Schema.addはSchemaコンストラクターで呼び出されるため、すべてのフィールドが元のコンストラクター呼び出しで送信されたかのようにモデルをアセンブルする必要があります。

3

このフレームワークのモデルでMongooseを確認してください。

https://github.com/marian2js/rode#models-with-mongoose

これは、このフレームワークで誰がシェマを拡張するかの例です。

まず、新しい「rodeモデル」内でスキーマを定義します。

var rode = require('rode');

var User = rode.Model.extend({
  name: 'User',
  schema: {
    name: {
      type: 'String',
      unique: true
    },
    email: String,
    password: String
  }
});

次に、extendメソッドを呼び出す必要があります。

var Admin = User.extend({
  name: 'Admin',
  // The schema for admins is the schema for users + their own schema
  schema: {
    lastAccess: Date
  }
});

ただし、フレームワークgithubから抽出したこのメモを念頭に置いてください。「両方のモデルはMongoDBで同じコレクションを共有します。拡張モデルのドキュメントには、区別するための属性_typeがあります。」

0
marian2js