16

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

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

4

5 に答える 5

18

この機能を探している他の人のために、Mongoose 3.8 には Discriminator 機能によるスキーマ継承が追加されました。

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

于 2013-11-17T21:53:11.210 に答える
17

Mongoose プラグインの使用を検討することをお勧めします。

「箱から出して」必要なことを行うプラグインは次のとおりです。

于 2013-01-09T05:41:26.320 に答える
3

これが古き良きものであることは承知していますが、同じ質問に対する答えを探してここにたどり着き、少し違うことをすることになりました。すべてのドキュメントが同じコレクションに保存されているため、識別子を使用したくありません。

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 コンストラクターで呼び出されるため、元のコンストラクター呼び出しですべてのフィールドが送信されたかのようにモデルを組み立てる必要があります。

于 2016-09-17T03:35:16.350 に答える
3

別のコレクションを使用する場合:

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

于 2017-07-28T18:47:52.723 に答える
0

Mongoose のこのフレームワークのモデルを確認します。

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

これは、このフレームワークで shemas を拡張するユーザーの例です。

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

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 から抽出された次のメモを心に留めておいてください。

于 2014-02-11T17:37:10.917 に答える