egg-mongoose 的写法怎么实现 Discriminators?
发布于 5 年前 作者 VincentSit 2913 次浏览 来自 问答

正常的 Mongoose 里 不使用 Discriminators 的写法:

> models/book.js

// Define our Book schema
const BookSchema = new mongoose.Schema(
  {
    title: { type: String, required: true },
    author: { type: String, required: true },
    release_date: { type: Date, required: true },
  }
);

// Create a model from our schema
module.exports = mongoose.model('Book', BookSchema);
> models/movie.js

const MovieSchema = new mongoose.Schema(
  {
    title: { type: String, required: true },
    director: { type: String, required: true },
    release_date: { type: Date, required: true },
  }
);

module.exports = mongoose.model('Movie', MovieSchema);

使用 Discriminators 的写法:

> models/book.js

const baseOptions = {
  discriminatorKey: 'itemtype', // our discriminator key, could be anything
  collection: 'items', // the name of our collection
};

const Base = mongoose.model('Base', new mongoose.Schema({
      title: { type: String, required: true },
      date_added: { type: Date, required: true },
      redo: { type: Boolean, required: false },
    }, baseOptions,
  ),
);

module.exports = mongoose.model('Base');
> models/book.js

const Base = require('./base'); // we have to make sure our Book schema is aware of the Base schema

const Book = Base.discriminator('Book', new mongoose.Schema({
    author: { type: String, required: true },
  }),
);

module.exports = mongoose.model('Book');
> models/movie.js

const Base = require('./base');

const Movie = Base.discriminator('Movie', new mongoose.Schema({
    director: { type: String, required: true },
  }),
);

module.exports = mongoose.model('Movie');

上面的例子在 egg-mongoose 里这样写:

> {app_root}/app/model/base.js

module.exports = app => {
  const mongoose = app.mongoose;
  const Schema = mongoose.Schema;

  const baseOptions = {
  discriminatorKey: 'itemtype', // our discriminator key, could be anything
  collection: 'items', // the name of our collection
  };

const BaseScheme = new Schema({
      title: { type: String, required: true },
      date_added: { type: Date, required: true },
      redo: { type: Boolean, required: false },
    }, baseOptions);

  return mongoose.model('Base', BaseScheme);
};
> {app_root}/app/model/book.js

const Base = require('./base');

module.exports = app => {
  const mongoose = app.mongoose;
  const Schema = mongoose.Schema;
  
  const BookSchema = new Schema({
    author: { type: String, required: true },
  });
  
  return Base.discriminator('Book', BookSchema);
};

这样做会报错,提示:

ERROR 30161 nodejs.TypeError: Base.discriminator is not a function

请问在 egg-mongoose 中在保持 model 分离的前提下如何实现上述功能?

其他

上面例子的代码源自 Getting started with Mongoose discriminators in Express.js

回到顶部